2

我有一个模板函数,我希望在不同的地方为不同的类型模板化。
问题是我想在编译时知道给定类型是否有专门化以两种不同的方式生成另一个模板。

template<typename T>
bool tobool(const T&){ throw Exception("Can't cast to bool");};
template<> bool tobool<bool>(const bool &value){ return value;}

我知道你可以像这里一样测试函数是否存在。

关于如何测试工具是否已专业化的任何机会?

想象一下,我想生成一个 isbool(),如果 tobool() 已被特化则返回 true,否则返回 false。

4

2 回答 2

3

作为一种(有点丑陋和脆弱的)解决方法,您可能需要对结构而不是函数进行专门化,并包含一个类常量来指示结构是否已被专门化:

template <typename T> 
struct ToBool {
   static bool tobool(const T&);
   static const bool specialized = false;
};

另一种选择是仅tobool在专业中定义。这样,就不会为任何尚未专门针对的类进行ToBool<Foo>::tobool(f)编译。FooToBool

作为 的替代方法tobool,如果您可以控制要转换的类,则可以使用显式转换运算符。

class Foo {
public:
    operator bool();
    ...
};
...
    Foo f;
    if (f) ...

如果该类型没有 bool 转换(嗯,转换为数字或指针类型,两者都有到 bool 的标准转换),程序将无法编译。瞧,编译时检查转换。

如果你不想隐式转换为 bool,你可以定义一个操作符!并使用双键进行显式转换(尽管这不那么可读):

class Foo {
public:
    bool operator!();
    ...
};

...
    Foo f;
    if (!!f) ...
于 2010-11-29T04:27:18.743 回答
0

您的具体问题的答案是:不,您无法检查 T 是使用主模板还是专用模板。@Martin York 的问题是一个很好的问题:你到底为什么要检查这个?:)

于 2010-11-28T20:37:23.637 回答