【问题标题】:Can C++ templates check if a function has been overloaded for a given type?C++ 模板可以检查给定类型的函数是否已重载?
【发布时间】:2010-11-28 20:23:16
【问题描述】:

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

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。

【问题讨论】:

  • 我理解正确吗? :您想要一个元函数,它为每种类型 T 显示是否为 T 专门设置了工具?
  • 是的,我需要知道 T 使用的是通用工具还是专用工具。
  • 所以在编译时你可以检查它的存在并处理结果?

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


【解决方案1】:

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

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

另一种选择是仅在专业化中定义tobool。这样一来,ToBool&lt;Foo&gt;::tobool(f) 就不会为ToBool 尚未专门化的任何类Foo 编译。

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

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

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

如果你不想隐式转换为布尔值,你可以定义一个运算符!并使用double-bang 进行显式转换(尽管这不那么可读):

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

...
    Foo f;
    if (!!f) ...

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 因为会有一个类模板 有一个方法 isbool() 如果 tobool 是特化的则返回 true,否则返回 false。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多