我有一个模板功能,我期望在不同的地方对不同类型进行模板化 问题是我想在编译时知道给定类型是否有专门化以2种不同的方式生成另一个模板。
template<typename T>
bool tobool(const T&){ throw Exception("Can't cast to bool");};
template<> bool tobool<bool>(const bool &value){ return value;}
我知道您可以像here一样测试功能存在。
如何测试tobool是否专业化的任何机会?
想象一下,我想生成一个isbool(),如果tobool()已经专门化则返回true,否则返回false。
答案 0 :(得分:3)
作为一种(有点丑陋和脆弱)的解决方法,您可能需要对结构而不是函数进行特化,并包含一个类常量来指示结构是否已被专门化:
template <typename T>
struct ToBool {
static bool tobool(const T&);
static const bool specialized = false;
};
另一种选择是仅在专业化中定义tobool
。这样,ToBool<Foo>::tobool(f)
将无法编译Foo
尚未专门用于的任何类ToBool
。
作为tobool
的替代方法,如果您可以控制要转换的类,则可以使用显式转换运算符。
class Foo {
public:
operator bool();
...
};
...
Foo f;
if (f) ...
如果类型没有bool转换(好吧,转换为数字或指针类型,两者都有标准转换为bool),程序将无法编译。瞧,编译时检查转换。
如果您不希望隐式转换为bool,则可以定义运算符!并使用double-bang进行显式转换(虽然这不是可读的):
class Foo {
public:
bool operator!();
...
};
...
Foo f;
if (!!f) ...
答案 1 :(得分:0)
您的具体问题的答案是:不,您无法检查T是使用主模板还是专用模板。 @Martin York的问题是一个很好的问题:为什么你要检查它? :)