我正在尝试一个类似于以下的课程
#include <cstdlib>
#include <iostream>
#include <typeinfo>
#include <type_traits>
#include <complex>
template<class K, class T = typename std::conditional<std::is_class<K>::value, typename K::value_type, K>::type>
class A {
public:
K v;
T u;
void type() {
std::cout << typeid(u).name() << std::endl;
}
};
int main() {
A<std::complex<double>> a;
a.type();
A<std::complex<float>> b;
b.type();
A<float> c;
c.type();
A<double> d;
d.type();
return 0;
}
这样输出将是:
d
f
f
d
另外,如果u
的类型为T
,则需要变量K
为std::complex<K>
,否则为K
。这可以用C ++ 11实现吗?感谢。
答案 0 :(得分:4)
您可以使用部分特化来获得正确的类型,可能是这样的:
template <typename T, bool> struct ValueType
{
using type = T;
};
template <typename T> struct ValueType<T, true>
{
using type = typename T::value_type;
};
template <class K>
struct A
{
using T = typename ValueType<K, std::is_class<K>::value>::type;
void type()
{
std::cout << typeid(T).name() << std::endl;
}
};
如果需要适当的数据成员,可以将类型别名设为类成员,然后声明类型为T
的数据成员。
答案 1 :(得分:3)
您可以轻松地使用部分模板特化和特征:
template <class T>
struct TypeForU_Class
{
typedef T type;
};
template <class T>
struct TypeForU_Class<std::complex<T>>
{
typedef T type;
};
template <class T>
using TypeForU = typename TypeForU_Class<T>::type;
template <class K, class T>
class A
{
public:
K v;
TypeForU<T> u;
// rest as before
};