静态在实例化时断言模板类型的大小

问题描述 投票:7回答:2

我想用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_assertsizeof不会在所有编译器(如Clang)中对未实例化的函数进行求值,因此将其置于虚拟成员函数中不是一种选择
  • static_assert放到构造函数或析构函数中会是一个解决方案,但在上面的例子中不存在用户定义的构造函数(考虑聚合),进一步想象多个构造函数的情况,我会避免在所有构造函数中执行断言
  • 从另一个结构继承A,并在static_assert的定义中执行A将是一个解决方案,但我想保持结构简单,而不会搞乱辅助结构

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

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

c++ templates static-assert
2个回答
0
投票

保证实例化的一个特殊成员函数(几乎)是析构函数:

~A() noexcept { static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong"); }

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>
>;
© www.soinside.com 2019 - 2024. All rights reserved.