C++泛型编程学习 std::declval

std::declval:将任何一个类型T转换成引用类型, 可以使 decltype 表达式中不必经过构造函数就能使用成员函数

给定一个变量或表达式,decltype能够推导出他的类型。最重要的是能够不需要计算表达式就可以推导出表达式所得值的类型。
struct Default { int foo() const { return 1; } };
struct NonDefault
{
    NonDefault(const NonDefault&) { }
    int foo() const { return 1; }
}
decltype(Default().foo()) n1 = 1;                   // type of n1 is int



//判断是否有这种类型
#define _HAS_TYPE_MEM_(parMTpNm)\
template>\
struct HTM_##parMTpNm: std::salse_type{}; \
template\
struct HTM_##parMTpNm>:std::true_type{};

eg: std::cout<< _HAS_TYPE_MEM_::value << std::endl;
//or std::cout<< HTM_type::value << std::endl;
   

//判断类是否有这种变量
#define _HAS_TYPE_VAR_(parMTpNm)\
template>\
struct HTM_##parMTpNm: std::salse_type{}; \
template\
struct HTM_##parMTpNm>:std::true_type{};

//判断类中是否存在成员函数
#define _HAS_TYPE_FUN_(parMTpNm)\
template>\
struct HTM_##parMTpNm: std::salse_type{}; \
template\
struct HTM_##parMTpNm().parMTpNm>>:std::true_type{};

//
typename = int typename = char 等
优先于
typename = void 
///

/// is_copy_assignable() 类对象是否可以拷贝复值
template>
struct ISCopyAssignable:std::false_type
{
};
template 
struct ISCopyAssignable()/*临时变量*/ = std::declval())> >:std::true_type
{
};
//





eg:
template>
struct IfCanAdd: std::false_type
{}

template
struct IfCanAdd() + std::declval())>>:std::true_type
{
    
}
/*
    template
    struct VerAddRet
    {
        //    using type = decltype(T() + U())
        using type = decltype(std::declval() + std::declval());
    }
*/
template::value>//泛
struct VerAddRet
{
    using type = decltype(std::declval() + std::declval());
}

template//特
struct VerAddRet
{
   
}

template
std::vector::type> operator+(std::verctor const&, std::verctor const&)
{
    std::verctor::type> tmpvec;
    return tmpvec;
}

struct elemC
{
      elemC(int i);
      elemC operator+(const elemC&t); 
}
std::vector vea;
std::vector veb;
vea + veb;

 

你可能感兴趣的:(C/C++)