使用模板化的定义获取 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 中。还有其他选择吗?
您的代码中有两个问题:
您在 TYPE_C::TYPE
之前缺少一个 typename
。由于 TYPE_C::TYPE
是依赖名称,因此您需要使用 typename
告诉编译器您正在寻找类型。
您不能在 std::conditional
1 表达式中使用 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_t
或 std::conditional<>::type
。
给定以下 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 中。还有其他选择吗?
您的代码中有两个问题:
您在
TYPE_C::TYPE
之前缺少一个typename
。由于TYPE_C::TYPE
是依赖名称,因此您需要使用typename
告诉编译器您正在寻找类型。您不能在
std::conditional
1 表达式中使用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_t
或 std::conditional<>::type
。