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

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

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

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

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

评论(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 楼

c++11里面有个static_assert
(http://en.wikipedia.org/wiki/C%2B%2B11#Static_assertions)