C ++模板可以检查函数是否已为给定类型重载?

时间:2010-11-28 20:23:17

标签: c++ templates g++ specialization template-specialization

我有一个模板功能,我期望在不同的地方对不同类型进行模板化 问题是我想在编译时知道给定类型是否有专门化以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。

2 个答案:

答案 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的问题是一个很好的问题:为什么你要检查它? :)