C++ 检查传递给变量模板的类型

C++ 检查传递给变量模板的类型,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,我想实现这样的目标: template<class... Args> class MyClass{ public: MyClass(){ for(auto arg : {sizeof(Args)...}) std::cout<<arg<<std::endl; } }; 模板 类MyClass{ 公众: MyClass(){ 对于(自动参数:{sizeof(参数)…}) std::cout模板 std::size

我想实现这样的目标:

template<class... Args>
class MyClass{
  public:
    MyClass(){
      for(auto arg : {sizeof(Args)...})
        std::cout<<arg<<std::endl;
    }
};
模板
类MyClass{
公众:
MyClass(){
对于(自动参数:{sizeof(参数)…})
std::cout
模板
std::size\u t size()
{
返回大小f(T);
}
模板
std::size\u t size()
{
返回0;
}
模板
类MyClass{
公众:
MyClass()
{
std::initializer_list{(std::cout
template
std::size\u t size()
{
返回大小f(T);
}
模板
std::size\u t size()
{
返回0;
}
模板
类MyClass{
公众:
MyClass()
{

std::initializer\u list{(std::cout以下内容如何

/* 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;
}
/*大量借用了IBM的可变模板页面*/
#包括
使用名称空间std;
/*
模板结构类型\u大小{
运算符int(){return sizeof(T);}
};
模板结构类型\u大小{
运算符int(){return 0;}
};
*/
/*根据Mattieu M.的建议*/
模板constexpr size\u t type\u size(t虚拟){
假人的返回尺寸;
}
constexpr size\u t type\u size(字符*){
返回0;
} 
模板结构容器{
容器(){
int数组[sizeof…(I)]={type_size()…};
printf(“容器”);
}
};
内部主(空){
容器g;
}

以下内容如何

/* 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;
}
/*大量借用了IBM的可变模板页面*/
#包括
使用名称空间std;
/*
模板结构类型\u大小{
运算符int(){return sizeof(T);}
};
模板结构类型\u大小{
运算符int(){return 0;}
};
*/
/*根据Mattieu M.的建议*/
模板constexpr size\u t type\u size(t虚拟){
假人的返回尺寸;
}
constexpr size\u t type\u size(字符*){
返回0;
} 
模板结构容器{
容器(){
int数组[sizeof…(I)]={type_size()…};
printf(“容器”);
}
};
内部主(空){
容器g;
}

你想实现什么?
sizeof(Args).
--告诉我你想打印类型的大小?我想存储除char*之外的已传递类型的大小(因为我无法识别它是char*还是int)。@MiniKarol:“因为我无法识别它是char*还是int”这对于任何指针类型都是正确的(并且只适用于32位编译器,或者64位编译器,它们的大小为
int
64位)。那么为什么要选择
char*
?你是对的。但是我只需要处理几个uint类型(8,16,32,64)和char*@MiniKarol:+1个非常有趣的问题!你想实现什么?
sizeof(Args).
--告诉我你想打印类型的大小?我想存储除char*之外的传递类型的大小(因为我无法识别它是char*还是int)。@MiniKarol:“因为我无法识别它是char*还是int”这对任何指针类型都是正确的(并且只在32位编译器上,或者在64位编译器上生成
int
64位大小)。那么为什么你要挑出
char*
?你是对的。但是我只需要处理几个uint类型(8,16,32,64)char*@MiniKarol:+1个非常有趣的问题!这应该会打印出这样的内容:
container
@MatthieuM.:你是指
for
-loop吗?我试着让代码尽可能接近OP的代码。显然,我没有通过检查:/n不,我说的是将类型与
操作符()一起使用
。它们可以是
constexpr
甚至
constexpr
函数。@MatthieuM.:+1!哦,是的!:)这些天需要提醒一下使用
constexpr可以做什么和不能做什么:p这应该打印如下内容:
container
@MatthieuM.:你是指
for
-循环吗?我试着让代码尽可能接近OP的代码。显然,我没有通过检查:/n不,我是说使用类型
operator()
。它们可能是
constexpr
,甚至是
constexpr
函数。@MatthieuM.:+1!哦,是的!:)这些天需要提醒一下关于
constexpr
可以做什么和不能做什么:P