如何解决C++:绕过依赖模板的方法
template <typename T1,typename T2>
class ClassName {
// Members variables and Functions based on the template parameter types
};
(T1,T2)
只能是 (class A,class B)
或 (class C,class D)
。
因此,仅 T1 就足以确定 T2。
有没有什么办法只把T1作为参数写同一个类?如果是,如何?
解决方法
如果您的模板仅依赖于单个参数,则不应使用 2 个参数进行声明。您可以将 std::conditional
与 std::is_same
一起使用来声明条件别名。
如果你愿意:
(T1,T2) 只能是 (class A,class B) 或 (class C,class D)
如果“only”是指:用户只为 A
或 C
实例化,在这种情况下 T2
应该是 B
/ D
:
#include <type_traits>
struct A {};
struct B {};
struct D {};
template <typename T>
struct Foo {
using T1 = T;
using T2 = std::conditional_t<std::is_same_v<A,T>,B,D>;
};
Foo<A>::T2
是 B
,Foo<C>::T2
是 D
。实际上,对于不是 Foo<T>::T2
的任何 D
,T
都是 A
。换句话说,如上所述,前提是它仅针对A
或C
进行实例化。如果模板本身应确保只有 A
或 C
的实例化有效,您可能需要添加 static_assert
(再次使用 std::is_same
检查 {{1 }} 是允许的类型之一)。
枚举您的配置:
enum class ClassConfigEnum { AB,CD};
template<ClassConfigEnum config> struct ClassConfig;
template<> struct ClassConfig<AB> {
using T1 = A;
using T2 = B;
};
template<> struct ClassConfig<CD> {
using T1 = C;
using T2 = D;
};
然后让类使用枚举配置
template <ClassConfigEnum config>
class ClassName {
using T1 = ClassConfig<config>::typename T1;
using T2 = ClassConfig<config>::typename T2;
};
,
你可以写一个类型特征:
#include <iostream>
#include <type_traits>
struct A {};
struct B {};
struct C {};
struct D {};
template <typename Type> struct Dependent {};
template<>
struct Dependent<A> {
using type = B;
};
template<>
struct Dependent<C> {
using type = D;
};
template <typename Type>
class ClassName {
using Dependent = typename Dependent<Type>::type;
};
int main()
{
static_assert(std::is_same<Dependent<A>::type,B>::value,"");
static_assert(std::is_same<Dependent<C>::type,D>::value,"");
// Dependent<B>::type a; error: 'type' is not a member of 'Dependent<B>'
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。