0

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

例如:

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++)。

附言。如果鸭子在这里输入错误,请告诉我,我相信它是正确的,但我不确定。

4

3 回答 3

4

考虑到您的意图,您的语法是错误的。由于T是一种类型,因此将使用双参数构造函数T(1, 2)构造一个临时类型的对象。T如果你想打电话给Ts 运营商(),你必须 вo 类似

T()(1, 2);

假设通过临时工程为您拨打电话。

如果T没有这样的 operator (),代码将无法编译。我实际上会说模板代码的一大好处是,只要语法有效(即您正在谈论的鸭式打字)它就“有效”,即无需通过要求operator ()be来进一步限制它当下。

当然,在我的示例中它实际上可能有意义,因为T = void (*)(int, int)代码在语法上是有效的,但会导致通过空指针调用函数。但同样,这是特定于我的代码版本的,我不知道T您要将运算符应用于哪个特定类型的对象()

话虽如此,但 Boost 库有很多特性允许人们检查这些属性并将它们用于模板元编程和/或静态断言中的分支,这一点毫无价值。

于 2012-06-30T00:00:58.730 回答
2

通过简单地表达模板,您需要 T 具有operator()(int, int). 如果没有,它将无法编译。

但是,如果您正在创建 API 并希望通知 API 的用户他们传递了不兼容的类型,那么您需要创建一个类型特征来检测运算符,您可以专门化该函数来区分该事实并创建一个static_assert 来表明事实。

于 2012-06-29T23:55:22.657 回答
0

如果您可以访问 decltype,则可以相对轻松地进行自己的检查。

template <class T, class U> class check_same_type_t;

template <class T> class check_same_type_t<T, T> { };

template <class T, class U>
void foo()
{
    U a,b;
    check_same_type_t<bool, decltype(T()(a, b))> check;
    bool truthiness = T()(a,b);
    if (truthiness) ;
        // do something
}

这启用了以下功能:

struct A {
    bool operator()(int, int) { return true; }
};

struct B {
    int operator()(int, int) { return 1; }
};

int
main()
{
    foo<A, int>(); // will compile
    foo<B, int>(); // won't compile

}

只要确保这是你真正想要的。强制通用算法使用特定类型可能会反过来咬你。如果一个类型可以隐式转换为 bool,为什么在你的条件下使用它不令人满意?

于 2012-07-03T04:38:07.913 回答