使用模板化的定义获取 class

Obtain using definition from templated class

给定以下 classes:

// Some random class
class A { };

// A templated class with a using value in it.
template<class TYPE_B> 
class B {
  public:
    using TYPE = TYPE_B;
};

接下来我们在class C中使用这两个classes。但是如果我们使用B作为模板参数,我们希望获得其中定义的TYPE。

template<class TYPE_C>
class C {
    // A check to see if we have a class of type B 
    static constexpr bool IS_B = std::is_same<B<int32_t>, TYPE_C>::value ||
                                 std::is_same<B<int64_t>, TYPE_C>::value;

  public:
    // This is what not works. How to get B::TYPE here?
    using TYPE = std::conditional<IS_B, TYPE_C::TYPE, TYPE_C>;
};

Class C 我们会像这样使用:

C<A> ca;
C<B<int32_t>> cb32;
C<B<int64_t>> cb64;

我正在 GCC 中编译它。我担心我不想做的事情是对与 B 一起使用的每种类型使用 std::is_same 语句。将其放在 std::conditional 中。还有其他选择吗?

您的代码中有两个问题:

  1. 您在 TYPE_C::TYPE 之前缺少一个 typename。由于 TYPE_C::TYPE 是依赖名称,因此您需要使用 typename 告诉编译器您正在寻找类型。

  2. 您不能在 std::conditional1 表达式中使用 TYPE_C::TYPE 因为当 TYPE_C 不是 B<>, 该表达式无效,但仍将被计算。

一个简单的解决方案是使用中间模板访问类型,使用模板特化,例如

template <class T>
struct get_C_type {
    using type = T;
};

template <class T>
struct get_C_type<B<T>> {
    using type = T;
};

template<class TYPE_C>
class C {
public:
    // you still need a typename here
    using TYPE = typename get_C_type<TYPE_C>::type;
};

1 你可能想在这里使用 std::conditional_tstd::conditional<>::type