静态在实例化

时间:2016-03-29 16:51:35

标签: c++ templates static-assert

我想在使用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将是一个解决方案,但我希望保持结构简单,弄乱辅助结构

我遗失的任何其他解决方案?

我决定取消删除这个问题,并在将来为可能的解决方案保持开放。

2 个答案:

答案 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>
>;