c++ - 在 C++ 中使用鸭子类型(duck typing)的模板

标签 c++ templates duck-typing

有没有办法要求模板类型具有属性?

例如:

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/

相关文章:

c++ - 这个模板参数是什么意思?

c# - 在 C# 中实现安全的鸭子类型(duck typing)

c++ - 如何在 C++ 中对成对 vector 的第二个元素执行 lower_bound 操作?

c++ - Visual Studio C++ - 缺少 "Copy to Output Directory"

c++ - friend 方法的参数列表中的不同模板特化

php - 在 PHP 中将对象和整数相加的语义?

interface - 鸭子类型(duck typing)与旧的 'variant' 类型和/或接口(interface)有何不同?

c++ - 通过串行连接的双向 C++ 通信

c++ - partial_sort 和智能指针

C++ 模板访问不同元素大小的数组?