繁体   English   中英

检查传递给可变参数模板的类型

[英]check types passed to variadic template

我想实现这样的目标:

template<class... Args>
class MyClass{
  public:
    MyClass(){
      for(auto arg : {sizeof(Args)...})
        std::cout<<arg<<std::endl;
    }
};

但是有一个简单的例外。 char *类型应返回0(或其他所有值,与int不同)。

接下来呢?

/* heavily borrowed from IBM's variadic template page */
#include <iostream>
using namespace std;

/*
template<typename T> struct type_size{
    operator int(){return sizeof( T );}
};

template<> struct type_size <char *>{
    operator int(){return 0;}
};
*/
/* as per Mattieu M.'s suggestion */
template<typename T> constexpr size_t type_size(T dummy) {
return sizeof dummy;
}

constexpr size_t type_size(char *){
    return 0;
} 
template <typename...I> struct container{
    container(){
    int array[sizeof...(I)]={type_size<I>()...};
    printf("container<");
    for(int count = 0; count<sizeof...(I); count++){
        if(count>0){
            printf(",");
        }
        printf("%d", array[count]);
    }
    printf(">\n");
    }
};

int main(void){
   container<int, short, char *> g;
}
template<typename T>
std::size_t size()
{
    return sizeof(T);
}

template<>
std::size_t size<char*>()
{
    return 0;
}

template<class... Args>
class MyClass{
public:
    MyClass()
    {
        std::initializer_list<char> { (std::cout << size<Args>(), void(), char {})... };
    }
};

虽然实际上我有一个EXPAND宏,它隐藏了std::initializer_list丑陋(更不用说void() +逗号运算符),使得它看起来像EXPAND( std::cout << size<Args>() )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM