C++-如何在编译期确定两个模版参数类型大小相同?

WP主题Bug提交 WP主题Bug提交 主题:1067 回复:2226

C++-如何在编译期确定两个模版参数类型大小相同?

泛泛之交 发布于 2017-03-04 字数 127 浏览 1023 回复 4
template< typename T1, typename T2 >
class ClassA
{
...
};

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(4

瑾兮 2017-10-21 4 楼

这是一个编译期约束的问题,先来一段较简单的代码:

template< typename T1, typename T2 >
class ClassA
{
public:
~ClassA()
{
void (*p) () = samesize;
}
private:
static void samesize()
{
const int T1_T2_SIZE = ( sizeof(T1) == sizeof(T2) );  // sizeof 是编译期计算类型大小的
int array[T1_T2_SIZE];  // 定义数组,如果T1和T2的大小不同,用0作为数组大小是非法的
}
};

但是这段代码还有个问题,如果模版类型是void的时候,还需要判断ClassA(int, void)或ClassA(void, void)等,但是sizeof(void)是非法的表达式。
要实现这个判断,解决方法是模版特化,直接看代码:

template < typename T >
struct size_of
{
enum { value = sizeof(T) };
};

template <> struct size_of<void> // 模版特化 { enum { value = 0 }; };

template < typename T1, typename T2 > class ClassA { public: ~ClassA() { void (*p) () = samesize; } private: static void samesize() { const int T1_T2_SIZE = ( size_of<T1>::value == size_of<T2>::value ); int array[T1_T2_SIZE]; } };

ClassA<int, int> a; // 编译正确 ClassA<int, char> a; // 编译错误 ClassA<void, int> a; // 编译错误 ClassA<void, void> a; // 编译正确

浮生未歇 2017-09-08 3 楼

 template < typename T1, typename T2 >
class ClassA
{
public:
~ClassA()
{
void (*p) () = samesize;
}
public:
static void samesize()
{
const int T1_T2_SIZE = ( typeid(T1).name() == typeid(T2).name() );
int array[T1_T2_SIZE];

}
};

可以使用typeid 。包含头文件typeinfo 就可以了。也可以用typeof 的方式实现,只不过只有GCC支持这个关键字。

晚风撩人 2017-08-26 2 楼

1.template< typename T1, typename T2 >
2.class ClassA
3.{
4....
5.};
在构造函数中用T1的参数初始化T2 用T2的参数初始化T1就可以
例如

 template< typename T1, typename T2 >
class ClassA
{
T1 T_1;
T2 T_2;
public:
A(T1 t1,T2 t2):T_1(t2),T_2(t1)
{
}

};

其实实验一个就可以了 不必两个都这么做
需要修改回来的话 在A的括号里在换回来

 class ClassA
{
T1 T_1;
T2 T_2;
public:
A(T1 t1,T2 t2):T_1(t2),T_2(t1)
{
T_1=t1,T_2=t2;
}

};

夜无邪 2017-05-05 1 楼