C++中能否动态决定模板使用的类?求优雅实现方案
解决方案
方法1:利用std::conditional实现链式条件判断
C++11及以上可借助<type_traits>库的std::conditional,通过嵌套实现多条件的编译期类型选择。先定义针对InputClass的判断逻辑,再依次匹配A、B、C类型。
示例代码:
#include <type_traits> class A{/**/}; class B{/**/}; class C{/**/}; // 示例判断逻辑:InputClass是int选A,是float选B,其余选C template <class InputClass> using SelectedType = std::conditional_t< std::is_same_v<InputClass, int>, A, std::conditional_t< std::is_same_v<InputClass, float>, B, C > >; template <class InputClass> class Child: public Parent<SelectedType<InputClass>>{ //... };
如果需要自定义复杂判断(比如检测类是否包含特定成员),可以先实现自定义类型特性:
// 自定义特性:检测InputClass是否有foo成员函数 template <typename T> struct has_foo { private: template <typename U> static auto test(int) -> decltype(&U::foo, std::true_type{}); template <typename U> static std::false_type test(...); public: static constexpr bool value = decltype(test<T>(0))::value; }; template <class InputClass> using SelectedType = std::conditional_t< has_foo<InputClass>::value, A, std::conditional_t< std::is_integral_v<InputClass>, B, C > >;
方法2:模板特化实现精准匹配
如果条件是针对特定InputClass类型,直接对类型选择器做模板特化更直观,适合规则明确的场景:
class A{/**/}; class B{/**/}; class C{/**/}; // 默认情况选C template <class InputClass> struct SelectType { using type = C; }; // 特化:InputClass为int时选A template <> struct SelectType<int> { using type = A; }; // 特化:InputClass为float时选B template <> struct SelectType<float> { using type = B; }; template <class InputClass> using SelectedType = typename SelectType<InputClass>::type; template <class InputClass> class Child: public Parent<SelectedType<InputClass>>{ //... };
方法3:C++20 Concepts 约束(可选)
若需更清晰地表达编译期类型约束,可结合C++20的Concepts语法:
#include <concepts> class A{/**/}; class B{/**/}; class C{/**/}; template <typename T> concept IsInt = std::is_same_v<T, int>; template <typename T> concept IsFloat = std::is_same_v<T, float>; template <class InputClass> using SelectedType = std::conditional_t< IsInt<InputClass>, A, std::conditional_t< IsFloat<InputClass>, B, C > >; template <class InputClass> class Child: public Parent<SelectedType<InputClass>>{ //... };
以上方案均为编译期完成的类型选择,无运行时开销,符合C++类型系统的设计逻辑。
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

