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::couttemplate
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