如何确定一个模板参数可以转换成算术类型?
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
{ };
我想要这样的东西:
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
{ };