std::result_of<test(Arg const&)>
提供模板參數,該參數是函數類型,參考Arg const
並返回test
。所以它的type
是test
,不太有幫助。
需要注意的是書面的,需要的代碼
bar b;
foo f;
b(f);
是有效的,真是5個要求:bar
和foo
每個可訪問的默認構造函數和析構函數,以及b(f)
是有效的表達式。我將專注於最後一個(這也許就是你的意思)。如果您確實是指其他部分,則可以使用標準<type_traits>
屬性添加這些部分。
功能std::declval
非常適合假裝你有一個給定類型的對象,即使你沒有。它絕對不能被調用,所以它通常只用在decltype
表達式中。
有兩種基本的方法來拉斷SFINAE技巧的基礎上,兩個地C++允許模板參數推導失敗只是放棄失敗的聲明:
首先,嘗試匹配一類偏專業化:
template<typename Func, typename Arg, typename Enable = void>
struct has_call_with_arg1 : public std::false_type {};
template<typename Func, typename Arg>
struct has_call_with_arg1<Func, Arg,
decltype(std::declval<Func&>()(std::declval<Arg&>()))>
: public std::true_type {};
其次,至少有一個重載是功能模板時的重載分辨率。 (一類模板的非模板成員函數不會在這裏工作,因爲實例化類需要每個成員的聲明是有效的。)
namespace has_call_with_arg_impl {
template<typename F, typename A>
std::true_type test(decltype(std::declval<F&>()(std::declval<A&>()))*);
template<typename F, typename A>
std::false_type test(...);
}
template <typename Func, typename Arg>
struct has_call_with_arg2
: public decltype(has_call_with_arg_impl::test<Func,Arg>(nullptr)) {};
演示:http://ideone.com/KgRI8y
-1 linkdumping。 – Puppy 2013-03-01 18:03:24
+1只是因爲這隻傻小狗。 – Abyx 2013-03-01 18:04:43
不是一個真正名副其實的成員職能和會員運營商通常是不同的交易。 – Puppy 2013-03-01 18:06:17