我有一个模板函数,它没有参数
template<typename T>
T cast() {
return T();
}
我想把它专门化为一些模板类,比如vector,比如
template<typename T>
template<>
vector<T> cast<vector<T>>() {
// something special
return vector<T>()
}
,因为它不带实参,所以不能重载。我应该怎么做才能实现它?
函数不能部分特化。
你可能
-
提供另一个自定义点
-
类,可以部分特化:
template <typename T> struct impl { T operator()() const { return T(); } }; template <typename T> struct impl<std::vector<T>> { std::vector<T> operator()() const { /*Something special*/ return std::vector<T>(); } }; template<typename T> T cast() { return impl<T>{}(); }
-
期待与"超载功能;tag":
template <typename T> T impl(std::struct_identity<T>) { return T(); }; template <typename T> std::vector<T> impl(std::struct_identity<std::vector<T>>) { /*Something special*/ return std::vector<T>(); }; template<typename T> T cast() { return impl(std::struct_identity<T>{}); }
-
-
创建不同的(独占的)重载(从开始):
// traits to detect std::vector template <typename T> struct is_vector : std::false_type {}; template <typename T, typename A> struct is_vector<std::vector<T, A>> : std::true_type {}; template<typename T, std::enale_if_t<!is_vector<T>::value, int> = 0> T cast() { return T(); } template<typename T, std::enale_if_t<is_vector<T>::value, int> = 0> T cast() { /*Something special*/ return T(); }
-
或自c++ 17起,使用
if constexpr
:// traits to detect std::vector template <typename T> struct is_vector : std::false_type {}; template <typename T, typename A> struct is_vector<std::vector<T, A>> : std::true_type {}; template<typename T> T cast() { if constexpr(is_vector<T>::value) { /*Something special*/ return T(); } else { return T(); } }
-
或c++ 20日以来,你可能过载约束:
// traits to detect std::vector template <typename T> struct is_vector : std::false_type {}; template <typename T, typename A> struct is_vector<std::vector<T, A>> : std::true_type {}; template<typename T> T cast() { return T(); } template<typename T> requires(is_vector<T>) T cast() { /*Something special*/ return T(); }