我正在寻找一种方法来识别模板类定义中的基元类型.
我的意思是,有这个课:
templateclass A{ void doWork(){ if(T isPrimitiveType()) doSomething(); else doSomethingElse(); } private: T *t; };
有没有办法"实现"isPrimitiveType().
更新:从C++ 11开始,使用is_fundamental
标准库中的模板:
#includetemplate void test() { if (std::is_fundamental ::value) { // ... } else { // ... } }
// Generic: Not primitive templatebool isPrimitiveType() { return false; } // Now, you have to create specializations for **all** primitive types template<> bool isPrimitiveType () { return true; } // TODO: bool, double, char, .... // Usage: template void test() { if (isPrimitiveType ()) { std::cout << "Primitive" << std::endl; } else { std::cout << "Not primitive" << std::endl; } }
为了保存函数调用开销,请使用结构:
templatestruct IsPrimitiveType { enum { VALUE = 0 }; }; template<> struct IsPrimitiveType { enum { VALUE = 1 }; }; // ... template void test() { if (IsPrimitiveType ::VALUE) { // ... } else { // ... } }
正如其他人所指出的那样,你可以节省你自己实现它的时间,并使用Boost Type Traits Library中的is_fundamental,这似乎完全相同.
Boost TypeTraits有很多东西.
我想这可以很好地完成这项工作,没有多个专业化:
# include# include template inline bool isPrimitiveType(const T& data) { return std::is_fundamental ::value; } struct Foo { int x; char y; unsigned long long z; }; int main() { Foo data; std::cout << "isPrimitiveType(Foo): " << std::boolalpha << isPrimitiveType(data) << std::endl; std::cout << "isPrimitiveType(int): " << std::boolalpha << isPrimitiveType(data.x) << std::endl; std::cout << "isPrimitiveType(char): " << std::boolalpha << isPrimitiveType(data.y) << std::endl; std::cout << "isPrimitiveType(unsigned long long): " << std::boolalpha << isPrimitiveType(data.z) << std::endl; }
输出是:
isPrimitiveType(Foo): false isPrimitiveType(int): true isPrimitiveType(char): true isPrimitiveType(unsigned long long): true