微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++:绕过依赖模板的方法

如何解决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::conditionalstd::is_same 一起使用来声明条件别名。

如果你愿意:

(T1,T2) 只能是 (class A,class B) 或 (class C,class D)

如果“only”是指:用户只为 AC 实例化,在这种情况下 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>::T2BFoo<C>::T2D。实际上,对于不是 Foo<T>::T2 的任何 DT 都是 A。换句话说,如上所述,前提是它仅针对AC 进行实例化。如果模板本身应确保只有 AC 的实例化有效,您可能需要添加 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 举报,一经查实,本站将立刻删除。