C++:如何在宏的#if条件中判断模板参数类型?
问题解答
首先明确:你设想的typeof(T) == typeof(int)这种在#if预处理宏中做类型判断的语法完全不存在。
原因很简单:#if是预处理阶段的指令,这个阶段在模板实例化之前执行,此时模板参数T还只是一个符号,预处理器根本不知道它会被替换成什么类型,自然没法做类型比较。
下面给你几种可行的替代方案:
1. C++11+:用std::enable_if实现SFINAE分支
如果只是类中的部分成员函数需要根据类型区分,可以用std::enable_if结合std::is_same来控制函数的启用:
#include <type_traits> #include <string> template <class T> class MyClass { T variable; public: // 仅当T是int时,这个版本的函数会被编译 typename std::enable_if<std::is_same<T, int>::value>::type process() { // section A 的逻辑 } // 仅当T是std::string时,这个版本的函数会被编译 typename std::enable_if<std::is_same<T, std::string>::value>::type process() { // section B 的逻辑 } };
2. 模板全特化
如果整个类的实现都因类型不同而差异巨大,可以直接对特定类型做类的全特化:
#include <string> // 基础模板(可以留空,或者写通用逻辑) template <class T> class MyClass; // int类型的专属实现 template <> class MyClass<int> { int variable; public: // section A 的所有成员和逻辑 }; // std::string类型的专属实现 template <> class MyClass<std::string> { std::string variable; public: // section B 的所有成员和逻辑 };
3. C++17+:if constexpr编译期分支
如果是在函数内部做类型分支判断,C++17引入的if constexpr可以在编译期解析条件,只保留符合条件的代码分支:
#include <type_traits> #include <string> template <class T> class MyClass { T variable; public: void process() { if constexpr (std::is_same_v<T, int>) { // section A 的逻辑,仅当T是int时编译 } else if constexpr (std::is_same_v<T, std::string>) { // section B 的逻辑,仅当T是std::string时编译 } } };
内容的提问来源于stack exchange,提问作者Debreczeni Kálmán
相关产品推荐
相关产品推荐

