加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 类复合体的值类型或类本身

发布时间:2020-12-16 09:55:19 所属栏目:百科 来源:网络整理
导读:我正在努力建立一个类似于以下的课程 #include cstdlib#include iostream#include typeinfo#include type_traits#include complextemplateclass K,class T = typename std::conditionalstd::is_classK::value,typename K::value_type,K::typeclass A { publi
我正在努力建立一个类似于以下的课程

#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

换句话说,如果K的类型为std :: complex< K>,则需要变量u为T类型,否则为K.这可以用C 11实现吗?谢谢.

解决方法

您可以使用部分特化来获得正确的类型,可能是这样的:

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的数据成员.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读