如何确定一个模板参数可以转换成算术类型?

How can determine a template parameter can be converted into arithmetic type?

我想要这样的东西:

template<typename T, typename = void> // sth like T=>int or T=>double not valid
struct test : std::false_type{};

template<typename T, ???> // what should i do?
struct test<T,???> : std::true_type{};

将导致:

std::cout << test<int>::value << std::endl;

会return"true",而自定义class

class a{ int a;double b};
std::cout << test<a>::value << std::endl;

会return"false"

总有一个完全显式的测试可以用于隐式转换

namespace detail
{
    std::true_type check(int);
    std::true_type check(float);
    std::true_type check(char);
    // ...
    std::false_type check(...);
}

template<typename T>
struct is_implicitly_convertible_to_arithmetic
    : decltype(::detail::check(std::declval<T>())) {};

这很冗长,但非常灵活。

假设:

  • 你问的是如何 SFINAE 专业化 test,
  • std::is_arithmetic代表你定义的可转换为算术类型,

您可以使用 std::enable_if 进行 test 的专业化:

template<typename T> 
struct test<
    T, 
    std::enable_if_t<std::is_arithmetic<T>::value>> : std::true_type
{ };