trait to check函数接受某些参数但不接受返回类型

Nic*_*aus 4 c++ type-traits c++11

我正在尝试在c ++ 11(msvc2013)中编写一个类型特征,这将允许我检查函数类型是否需要某些参数.我希望它检查返回类型.我认为这个想法基本上等同于std::is_callable,但我有兴趣知道我的方法有什么问题,除了如何真正解决问题.

我的实施:

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 {};
}
Run Code Online (Sandbox Code Playgroud)

我的测试用例:

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;
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 5

有一些问题,可以通过更好的编译器检测到;)但是如果你修复它们,你的代码将适用于VS 2013(使用12.0.31101.00 Update 4测试):

static auto test(U*)->decltype(declval<U>()(c, l), std::true_type);
                               #1           #2     #3
Run Code Online (Sandbox Code Playgroud)
  1. 这应该是std::declval.
  2. 即使在非推断的上下文中,也不能在成员函数static的声明中引用非数据成员static.这应该是(std::declval<char const*>(), std::declval<std::size_t>()).
  3. std::true_type是一个类型,decltype是一个表达式上下文.写std::true_type{}.

例子.