1

可以使用以下模式来检测是否可以将 x 应用于 T

template<class T, class Enable = void>
struct CanDoX: std::false_type{};

template<class T>
struct CanDoX<T, std::void_t<decltype(x(std::declval<T>()))>>:std::true_type{};

如果x被定义为

Foo const& x(Bar const&&) = delete;
Foo const& x(Bar const& val) 
    {return val.get();}

现在CanDoX<Bar>::valuefalse,因为没有重载接受临时的。Bar val不知何故,在测试之前必须有一个x(val)

4

1 回答 1

0

std::declval<T>()返回 aT&&所以更好的匹配是Foo const& x(Bar const&&).

但是您可以在内部使用左值引用std::declval来获取左值:

template<class T>
struct CanDoX<T, std::void_t<decltype(x(std::declval<T&>()))>>:std::true_type{};

或者

template<class T>
struct CanDoX<T, std::void_t<decltype(x(std::declval<const T&>()))>>:std::true_type{};

看你的需要。

于 2019-08-28T17:32:16.873 回答