提问人:plasmacel 提问时间:3/30/2016 最后编辑:plasmacel 更新时间:3/14/2019 访问量:1755
Static 断言实例化时模板类型的大小
Static assert the size of a template type on instantiation
问:
我想在实例化时检查以下结构的大小,以约束未命名的紧密打包,因此的大小等效于 。static_assert
struct
A
sizeof(T) * 3
template <typename T>
struct A
{
union
{
struct { T a, b, c; };
T arr[3];
};
};
这可以通过以下方式完成
static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong");
然而
由于在其类定义中仍然是一个不完整的类型,因此将上述内容放入类定义中不是一个选项
A<T>
static_assert
static_assert
with 不会在所有编译器(如 Clang)中计算未实例化的函数,因此将其放入虚拟成员函数中不是一种选择sizeof
使用构造函数或析构函数将是一个解决方案,但是在上面的示例中不存在用户定义的构造函数(考虑聚合),此外,想象一下多个构造函数的情况,我将避免在所有构造函数中执行断言
static_assert
从另一个结构体继承,并在 的定义中执行它将是一个解决方案,但我想保持结构简单,而不会弄乱帮助程序结构
A
static_assert
A
我错过了任何其他解决方案吗?
我决定取消删除这个问题,并保持开放状态,以便将来可能的解决方案。
答:
0赞
ecatmur
3/30/2016
#1
一个保证被实例化的特殊成员函数(几乎)是析构函数:
~A() noexcept { static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong"); }
评论
1赞
plasmacel
3/30/2016
是的,但正如@Jarod42在他的评论中所说,这将破坏聚合规则并微不足道地默认可破坏性。
0赞
Red.Wave
3/14/2019
#2
namespace my_private_impl{
struct impl_tag{};
template <typename T,typename tag>
struct A_impl{
static_assert(is_same<tag,impl_tag>{}(),"you evil cheater");
union{
struct { T a, b, c; };
T arr[3];
};
};
};
template<typename T>
using A=std::enable_if_t<
sizeof(my_private_impl::A_impl<T,my_private_impl::impl_tag>) == sizeof(T) * 3,
my_private_impl::A_impl<T,my_private_impl::impl_tag>
>;
评论
sizeof
T
sizeof