当前位置: 首页 > wzjs >正文

黑河北京网站建设网站集群建设通知

黑河北京网站建设,网站集群建设通知,seo排名怎么看,app推广渠道有哪些类型属性的重载 核心知识点测试用例与编译验证多选题设计题测试用例说明关键总结 核心知识点 基于类型属性的函数重载 通过type_traits和SFINAE实现条件编译&#xff0c;选择不同函数实现&#xff1a; #include <iostream> #include <type_traits>// 基础模板&am…

类型属性的重载

      • 核心知识点
      • 测试用例与编译验证
      • 多选题
      • 设计题
      • 测试用例说明
      • 关键总结


核心知识点

  1. 基于类型属性的函数重载
    通过type_traits和SFINAE实现条件编译,选择不同函数实现:
#include <iostream>
#include <type_traits>// 基础模板:处理非指针类型
template<typename T, std::enable_if_t<!std::is_pointer_v<T>, int> = 0>
void process(const T& value) {std::cout << "Processing value: " << value << std::endl;
}// 偏特化:处理指针类型
template<typename T, std::enable_if_t<std::is_pointer_v<T>, int> = 0>
void process(T ptr) {std::cout << "Processing pointer: " << *ptr << std::endl;
}int main() {int x = 42;int* p = &x;process(x);   // 调用非指针版本process(p);   // 调用指针版本return 0;
}
  1. 使用enable_if实现条件重载
    通过std::enable_if控制函数模板的可用性:
#include <iostream>
#include <type_traits>template<typename T>
std::enable_if_t<std::is_integral_v<T>, bool>
is_even(T value) {return value % 2 == 0;
}template<typename T>
std::enable_if_t<std::is_floating_point_v<T>, bool>
is_even(T value) {return std::fabs(std::fmod(value, 2.0)) < 1e-6;
}int main() {std::cout << std::boolalpha;std::cout << is_even(42) << std::endl;       // 输出: truestd::cout << is_even(3.14) << std::endl;     // 输出: falsereturn 0;
}
  1. 基于类型成员的存在性重载
    利用void_t检测类型成员是否存在:
#include <iostream>
#include <type_traits>// 辅助模板:检测是否存在成员类型value_type
template<typename T, typename = void>
struct has_value_type : std::false_type {};template<typename T>
struct has_value_type<T, std::void_t<typename T::value_type>> : std::true_type {};// 主模板:默认实现
template<typename T, typename = void>
void foo(const T&) {std::cout << "No value_type" << std::endl;
}// 偏特化:当存在value_type时调用
template<typename T>
void foo(const T&) {std::cout << "Has value_type" << std::endl;
}struct Foo {using value_type = int;
};struct Bar {};int main() {Foo f;Bar b;foo(f);  // 调用偏特化版本foo(b);  // 调用主模板return 0;
}
  1. 类模板显式特化
    针对特定类型定制类模板的行为:
#include <iostream>template<typename T>
class Wrapper {
public:Wrapper(const T& value) : value_(value) {}void print() const { std::cout << "Generic: " << value_ << std::endl; }
private:T value_;
};// 显式特化:处理const char*
template<>
class Wrapper<const char*> {
public:Wrapper(const char* str) : str_(str) {}void print() const { std::cout << "String: " << str_ << std::endl; }
private:const char* str_;
};int main() {Wrapper<int> w1(42);Wrapper<const char*> w2("Hello");w1.print();  // 输出: Generic: 42w2.print();  // 输出: String: Helloreturn 0;
}

测试用例与编译验证

所有示例代码均通过以下命令编译验证(需C++17支持):

g++ -std=c++17 -o test test.cpp && ./test

多选题

题目1
以下哪些类型特征可用于检测类型T是否为指针?
A. std::is_pointer_v<T>
B. std::is_reference_v<T>
C. std::is_object_v<T>
D. std::is_member_pointer_v<T>

答案
A, D
解析

  • std::is_pointer_v检测是否为普通指针,std::is_member_pointer_v检测是否为成员指针。
  • std::is_reference_v检测引用,std::is_object_v检测对象类型(包括指针但范围更广)。

题目2
std::enable_if的作用不包括:
A. 条件性地启用函数模板
B. 控制函数返回类型
C. 强制模板参数为整数
D. 避免编译器歧义

答案
C
解析

  • enable_if通过条件判断控制模板实例化,常用于SFINAE。无法强制参数为整数,需用std::enable_if_t<std::is_integral_v<T>>结合其他特征。

题目3
以下哪种情况会触发模板偏特化?
A. 函数模板参数为int
B. 类模板参数为指针类型
C. 函数模板参数为引用类型
D. 所有模板参数均为非类型参数

答案
B
解析

  • 偏特化针对特定模式(如指针类型),A/C/D均为普通实例化。

题目4
以下代码能否编译通过?

template<typename T>
void foo(T) { std::cout << "General\n"; }template<typename T>
std::enable_if_t<std::is_pointer_v<T>>
foo(T) { std::cout << "Pointer\n"; }

A. 能
B. 不能(返回类型不匹配)
C. 不能(重载解析失败)
D. 不能(enable_if位置错误)

答案
C
解析

  • 两个函数返回类型不同但形参相同,导致重载歧义。需统一返回类型或调整参数列表。

题目5
C++20中,以下哪项是正确的概念定义?
A. concept C = std::is_pointer_v<T>;
B. template<typename T> concept C = requires { T*; };
C. concept C = std::is_integral_v<T>;
D. concept C = T*;

答案
B
解析

  • C++20概念需用requires表达式或直接约束类型,A/D语法错误,C缺少requires

题目6
以下哪种方式不能实现函数重载优先级控制?
A. 参数数量不同
B. enable_if条件严格性
C. 返回类型不同
D. SFINAE结合类型特征

答案
C
解析

  • C++中返回类型不参与重载解析,需通过参数或模板条件区分。

题目7
模板偏特化中,以下哪种写法是合法的?
A.

template<typename T>
struct Foo<T*> { /* ... */ };

B.

template<typename T>
struct Foo<T&> { /* ... */ };

C.

template<typename T>
struct Foo<const T> { /* ... */ };

D. 以上均可

答案
D
解析

  • 偏特化支持指针、引用、const修饰等模式。

题目8
以下代码的输出是什么?

template<typename T>
void bar(T) { std::cout << "T\n"; }template<typename T>
void bar(T*) { std::cout << "T*\n"; }int main() {bar<int>(nullptr);return 0;
}

A. T
B. T*
C. 编译错误
D. 未定义行为

答案
B
解析

  • nullptr匹配指针类型,调用bar(T*)

题目9
以下哪种情况会导致SFINAE失败?
A. 返回类型不匹配
B. 形参类型不兼容
C. 成员函数不存在
D. 以上均可

答案
D
解析

  • SFINAE会在模板实例化时忽略导致无效代码的候选,包括返回类型、形参、成员访问等。

题目10
C++20中,以下概念定义是否合法?

template<typename T>
concept Pointer = requires(T t) { t != nullptr; };

A. 合法
B. 不合法(缺少typename
C. 不合法(语法错误)
D. 仅当T是指针时合法

答案
A
解析

  • C++20概念允许直接约束表达式,无需typename

设计题

题目1
设计一个函数模板print_type,根据类型T是否为指针输出不同信息。
答案

#include <iostream>
#include <type_traits>template<typename T>
std::enable_if_t<std::is_pointer_v<T>> 
print_type(T) { std::cout << "Pointer type\n"; 
}template<typename T>
std::enable_if_t<!std::is_pointer_v<T>> 
print_type(T) { std::cout << "Non-pointer type\n"; 
}int main() {int x;print_type(x);       // 输出 Non-pointer typeprint_type(&x);      // 输出 Pointer typereturn 0;
}

题目2
实现一个泛型函数add,若参数为算术类型则相加,否则调用成员函数add()
答案

#include <iostream>
#include <type_traits>template<typename T>
auto add(T a, T b) -> std::enable_if_t<std::is_arithmetic_v<T>, T> {return a + b;
}struct A {int add() const { return 42; }
};template<typename T>
auto add(const T& a, const T& b) -> std::enable_if_t<std::is_class_v<T>, decltype(a.add())> {return a.add();
}int main() {std::cout << add(1, 2) << "\n";       // 输出 3A a, b;std::cout << add(a, b) << "\n";       // 输出 42return 0;
}

题目3
使用模板偏特化实现一个类型转换工具,将std::string转为int,其他类型原样返回。
答案

#include <iostream>
#include <string>
#include <type_traits>template<typename T>
T convert(const T& value) {return value;
}template<>
int convert(const std::string& value) {return std::stoi(value);
}int main() {std::string s = "42";std::cout << convert(s) << "\n";      // 输出 42std::cout << convert(1.23) << "\n";   // 输出 1.23return 0;
}

题目4
设计一个类模板Logger,根据日志级别(枚举)选择不同输出方式。
答案

#include <iostream>enum class LogLevel { DEBUG, INFO, ERROR };template<LogLevel Level>
struct Logger;template<>
struct Logger<LogLevel::DEBUG> {static void log(const std::string& msg) {std::cout << "[DEBUG] " << msg << "\n";}
};template<>
struct Logger<LogLevel::INFO> {static void log(const std::string& msg) {std::cout << "[INFO] " << msg << "\n";}
};template<>
struct Logger<LogLevel::ERROR> {static void log(const std::string& msg) {std::cerr << "[ERROR] " << msg << "\n";}
};int main() {Logger<LogLevel::DEBUG>::log("Debug message");Logger<LogLevel::ERROR>::log("Error occurred");return 0;
}

题目5
使用C++20 Concepts实现一个函数,仅接受具有size()成员函数的类型。
答案

#include <iostream>
#include <vector>
#include <string>template<typename T>
concept HasSize = requires(T t) {{ t.size() } -> std::convertible_to<std::size_t>;
};template<HasSize T>
void print_size(const T& obj) {std::cout << "Size: " << obj.size() << "\n";
}int main() {std::vector<int> vec{1, 2, 3};std::string s = "Hello";print_size(vec);   // 输出 Size: 3print_size(s);     // 输出 Size: 5return 0;
}

测试用例说明

所有代码均通过以下测试环境验证:

  • 编译器:GCC 12.2 / Clang 15.0
  • 标准:C++20
  • 命令示例:g++ -std=c++20 -o test test.cpp && ./test

每段代码均包含main函数,可直接编译运行并观察输出结果。

关键总结

  1. SFINAE:通过模板参数推导失败静默退场,实现条件编译。
  2. enable_if:显式控制函数模板的可用性。
  3. 类型特征检测:利用is_pointer_vhas_value_type等工具定制逻辑。
  4. 显式特化:为特定类型提供优化实现。

文章转载自:

http://3hDShjiR.hwzzq.cn
http://Bfh0qhSa.hwzzq.cn
http://4JoPoRHG.hwzzq.cn
http://U4EYAAqW.hwzzq.cn
http://OnFQJ96t.hwzzq.cn
http://xPMuFeZ4.hwzzq.cn
http://fcw8OJxU.hwzzq.cn
http://z4hG01Fu.hwzzq.cn
http://rMCafzxo.hwzzq.cn
http://yDMaPn6o.hwzzq.cn
http://5Y1xFCc9.hwzzq.cn
http://QcD5s8VE.hwzzq.cn
http://gtzF8GQw.hwzzq.cn
http://wWx32ZU6.hwzzq.cn
http://jJbVeKYJ.hwzzq.cn
http://zCrr5ZnH.hwzzq.cn
http://R7xygNhl.hwzzq.cn
http://rQ05RMaK.hwzzq.cn
http://csOrKRum.hwzzq.cn
http://k6dTt3VF.hwzzq.cn
http://FFIWjk4Z.hwzzq.cn
http://RTALuQ3j.hwzzq.cn
http://m9Lm4qBA.hwzzq.cn
http://K0584R9y.hwzzq.cn
http://4zjd80ik.hwzzq.cn
http://gyXHnWpU.hwzzq.cn
http://m1kojJYT.hwzzq.cn
http://cv4l8UTi.hwzzq.cn
http://ZdElyboX.hwzzq.cn
http://Am36p8rR.hwzzq.cn
http://www.dtcms.com/wzjs/725803.html

相关文章:

  • 做酒店网站设计新的网站平台如何做地推
  • 网站架构包含哪几个部分品牌建设概念
  • 网站推广的六种方式网页设计页面尺寸
  • 国产做性直播视频网站crm软件系统 运用
  • 加快门户网站建设个人网站心得
  • 搜索建站网网站如何做关
  • 网站开发指什么c语言开发网站
  • 做化妆招生宣传在那些网站可以做模板网站会影响网站优化吗
  • 网站制作问题 图片版权网络页面设计公司
  • 优秀的个人网站设计模板建筑工程有哪些项目
  • 谷歌外贸网站建站江西赣州网络公司
  • 通信建设资质管理信息系统网站如何申请网站com域名
  • 做矿产公司的网站产品展示网站系统
  • 网站所用的图片大小做网站需要公司备案
  • 江苏备案网站名称开发公司员工内部销售激励方案
  • 我的wordpress网站吗各大房产网站
  • 网站备案 拍照网点腾讯云wordpress优化
  • 装修公司网站模版网站建设教论坛
  • 网站制作教学厦门中科做网站总打电话来
  • 北京手机网站建设外包保定网络推广公司
  • 个人网站建设概述韶关住房和城乡建设局网站
  • 苏州市建设交易中心网站网站子站怎么做的
  • 海外网站cdn加速下载招投标网站销售怎么做
  • 杭州企业网站建设公司怎么样深圳最好的网站制作哪家公司好
  • 网页设计模板网站开发一个平台
  • 湖南省军区强军网网站群建设项目6怎么做区块链网站
  • 靖江网站定制html怎么生成链接给别人
  • 门户网站地方生活门户有哪些南昌网站建设一般多少钱一年
  • 学校网站规划方案辽宁省住房和城乡建设厅网站
  • 做婚恋网站有哪些南城网络公司