gpt4 book ai didi

c++ - C++ 模板可以检查函数是否已针对给定类型重载吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:16 25 4
gpt4 key购买 nike

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

最佳答案

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

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,可以定义一个运算符!并使用 double-bang对于显式转换(虽然这不是可读的):

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

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

关于c++ - C++ 模板可以检查函数是否已针对给定类型重载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4298875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com