非invokables的示例赋值运算符?

时间:2016-05-12 07:38:59

标签: c++ c++14 c++17

我有一个可调用f s。

的赋值运算符
template <typename F>
auto operator=(F&& f) -> decltype(f(), *this);

我还需要一个不可调用的f,因此在分配时不会有歧义。

2 个答案:

答案 0 :(得分:2)

template<class F>
auto assign_impl(F&& f, int) -> decltype((void) f(), *this) {
    // f() is valid ...
}

template<class F>
auto assign_impl(F&& f, long) -> decltype(*this) {
    // everything else
}

template<class F>
auto operator=(F&& f) -> decltype(*this) { 
    return assign_impl(std::forward<F>(f), 0);
}

答案 1 :(得分:0)

我已将T.C.s答案转换为类型特征,现在正在使用它。

namespace
{

template <typename F, typename ...A>
auto f(int) -> decltype(
  (void)::std::declval<F>()(::std::declval<A>()...),
  ::std::true_type{}
);

template <typename F, typename ...A>
auto f(long) -> ::std::false_type;

}

template <typename F, typename ...A>
struct is_invokable : decltype(f<F, A...>(0))
{
};