类复杂的值类型,或类本身

时间:2014-11-27 13:50:21

标签: c++ templates c++11 types template-meta-programming

我正在尝试一个类似于以下的课程

#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,则需要变量Kstd::complex<K>,否则为K。这可以用C ++ 11实现吗?感谢。

2 个答案:

答案 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
};