gex*_*ide 18 c++ templates sizeof static-assert
我需要确保模板结构与其成员的大小完全相同.static_assert似乎是这里的首选工具.但是,我不能static_assert在结构本身内部使用,因为那里的大小还不知道.这是我想要的:
template<typename T1,typename T2>
struct foo {
T1 v1;
T2 v2;
// Doesn't compile, invalid application of sizeof to incomplete type
static_assert(sizeof(foo<T1,T2>)==sizeof(T1)+sizeof(T2),"Struct size invalid");
};
Run Code Online (Sandbox Code Playgroud)
这不起作用.那怎么办呢?我不想让实例化模板的人在每个实例化中检查自己.只要实例化结构,检查应该是完全自动的.
Yak*_*ont 15
重命名foo为foo_t.
template<class A, class B>
struct foo_helper {
using type=foo_t<A,B>;
static_assert(sizeof(A)+sizeof(B) == sizeof(type), "ouch");
};
template<class A, class B>
using foo=typename foo_helper<A,B>::type;
Run Code Online (Sandbox Code Playgroud)
请注意,在某些情况下使用foo而不是foo_t块扣除,所以这种技术并不完美.
您可以添加一个图层:
template<typename T1,typename T2>
struct bar {
T1 v1;
T2 v2;
};
template<typename T1,typename T2>
struct foo : bar<T1, T2> {
static_assert(sizeof(bar<T1, T2>) == sizeof(T1) + sizeof(T2), "Struct size invalid");
};
Run Code Online (Sandbox Code Playgroud)
将静态断言放在成员函数中.
template<typename T1,typename T2>
struct foo {
T1 v1;
T2 v2;
static auto assertion()
{
static_assert(sizeof(foo<T1,T2>)==sizeof(T1)+sizeof(T2),"Struct size invalid");
}
};
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为在类具有完整定义之前,不会编译成员函数的内容.
无需调用该功能.
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |