有没有办法要求模板类型具有属性?
例如:
template <typename T, typename U>
void foo()
{
U a,b;
bool truthiness = T()(a,b);
if (truthiness)
// do something
}
那么,我如何要求 T
定义返回特定类型的 operator()(U a, U b)
?这可能吗? (我知道它在 d 中,但我不确定 c++)。
附言。如果鸭子类型(duck typing)在这里打字有误,请告诉我,我相信它是正确的,但我不确定。
最佳答案
考虑到您的意图,您的语法是错误的。由于 T
是一种类型,因此 T(1, 2)
将使用双参数构造函数构造类型为 T
的临时对象。如果你想调用 T
的运算符 ()
你必须像这样
T()(1, 2);
假设通过临时电话为您的目的工作。
如果 T
没有这样的运算符 ()
,代码将无法编译。我实际上会说模板代码的一大好处是只要语法有效它就“有效”(即你正在谈论的鸭子类型(duck typing)),即没有必要通过要求进一步限制它 operator ()
存在。
当然,在我的示例中它实际上可能有意义,因为对于 T = void (*)(int, int)
代码在句法上是有效的,但会导致函数调用一个空指针。但同样,这是我的代码版本所特有的,我不知道您要将运算符 ()
应用到哪个类型为 T
的特定对象。
话虽如此,Boost 库具有相当多的功能,这些功能允许人们检查此类属性并将它们用于模板元编程和/或静态断言中的分支,这毫无值(value)。
关于c++ - 在 C++ 中使用鸭子类型(duck typing)的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11270309/