我想在使用static_assert
进行实例化时检查以下结构的大小,以限制未命名的struct
被紧密打包,因此A
的大小等于{{1} }}
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
并未评估所有编译器(如Clang)中未实例化的函数内部,因此将其置于虚拟成员函数中不是一个选项
将sizeof
放到构造函数或析构函数中将是一个解决方案,但在上面的示例中,不存在用户定义的构造函数(想想聚合),进一步想象一下多个构造函数,我将避免在所有构造函数中执行断言
从另一个结构继承static_assert
,并在A
的定义中对其执行static_assert
将是一个解决方案,但我希望保持结构简单,弄乱辅助结构
我遗失的任何其他解决方案?
我决定取消删除这个问题,并在将来为可能的解决方案保持开放。
答案 0 :(得分:0)
保证实例化的一个特殊成员函数(几乎)是析构函数:
~A() noexcept { static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong"); }
答案 1 :(得分:0)
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>
>;