不可调用对象的示例赋值运算符?
example assignment operator for non-invokables?
我有这个赋值运算符用于可调用的 f
s。
template <typename F>
auto operator=(F&& f) -> decltype(f(), *this);
我还需要一个用于不可调用的 f
s,因此在分配它们时不会有歧义。
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);
}
我已将 T.C.s answer 转换为类型特征并正在使用它。
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))
{
};
我有这个赋值运算符用于可调用的 f
s。
template <typename F>
auto operator=(F&& f) -> decltype(f(), *this);
我还需要一个用于不可调用的 f
s,因此在分配它们时不会有歧义。
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);
}
我已将 T.C.s answer 转换为类型特征并正在使用它。
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))
{
};