4
我想在C++ 11(msvc2013)中編寫一個類型特徵,這將允許我檢查函數類型是否需要某些參數。我不要希望它檢查返回類型。我認爲這個想法基本上等於std::is_callable
,但我很想知道我的方法有什麼問題,除了如何真正解決問題。trait檢查函數接受某些參數,但不返回類型
我的實現:
namespace traits
{
namespace detail
{
template <typename T>
struct is_write_function_impl
{
const char* c = nullptr;
size_t l = 0;
template<typename U>
static auto test(U*)->decltype(declval<U>()(c, l), std::true_type);
template<typename U>
static auto test(...)->std::false_type;
using type = decltype(test<T>(0));
};
}
template <typename T>
struct is_write_function : detail::is_write_function_impl<T>::type {};
}
我的測試用例:
std::ofstream os;
auto valid = std::bind(&std::ofstream::write, &os,
std::placeholders::_1, std::placeholders::_2);
// want this to be 'true' but get 'false'
std::cout << traits::is_write_function<decltype(valid)>::value;
我聽說VS 2013不支持表達式SFINAE,所以它可能無法在VS 2013中實現。 – cpplearner
@cpplearner不知道它是否是蘋果和桔子,但我使用這個基本模式來檢查類的靜態成員函數所有的時間在2013年。我只是無法適應功能對象。 –