std::declval<T>()
为了救援:
T
引用类型,使使用
成员函数
decltype
表达
不需要去
.
注意,因为declval没有定义,所以只能是
在未评估的上下文中使用;我
...
decltype( test(std::declval<T>(),can_convert_to_base()) )
...
既然我们已经到了,你的解决方案就太复杂了。我会这样做:
struct B {
template <typename T, class = decltype(std::cout << std::declval<T>())>
B& operator<<(const T& t)
{
std::cout << t;
return *this;
}
};
不过,如果有更简单的解决方案,我会很感兴趣
template <typename T>
struct has_out_op_impl
{
template <class U, class = decltype(std::cout << std::declval<U>())>
static auto foo(U) -> std::true_type;
static auto foo(...) -> std::false_type;
using Type = decltype(foo(std::declval<T>()));
};
template <class T>
struct has_out_op : has_out_op_impl<T>::Type
{};
struct A{};
int t1()
{
static_assert(has_out_op<int>::value == true, "");
static_assert(has_out_op<A>::value == false, "");
}