我正在玩proposal of standard library support for the C++ detection idiom。它是一種性狀狀元函數,其確定類型T
是否有一個名爲T::type
類型成員或具有特定簽名的成員函數,例如:使用檢測成語來確定某個類型是否具有特定簽名的構造函數
#include <iostream>
template<class...>
using void_t = void;
template<class, template<class> class, class = void_t<>>
struct detect : std::false_type { };
template<class T, template<class> class Operation>
struct detect<T, Operation, void_t<Operation<T>>> : std::true_type { };
template<class T>
using bar_t = decltype(std::declval<T>().bar());
template<class T>
using bar_int_t = decltype(std::declval<T>().bar(0));
template<class T>
using bar_string_t = decltype(std::declval<T>().bar(""));
struct foo
{
int bar() { return 0; }
int bar(int) { return 0; }
};
int main()
{
std::cout << detect<foo, bar_t>{} << std::endl;
std::cout << detect<foo, bar_int_t>{} << std::endl;
std::cout << detect<foo, bar_string_t>{} << std::endl;
return 0;
}
上述代碼產生預期的輸出
1
1
0
你可以玩live demo。現在,我想測試一個T
類型是否具有帶特定簽名的構造函數,例如T::T(U)
與另一種類型U
。使用檢測用語可以做到這一點嗎?
出了什麼問題'的std :: is_constructible'? –