假设我有以下类模板:
template<typename T>
struct Wrapper {
T* t_;
static void check() {
static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
}
};
我查看了 C99 标准和 C++03 标准,但无法为我在static_assert
. 我使用几个编译器选项在 Visual C++ 2008 和 2010(32 位)和 linux(64 位)上的 gcc 上进行了尝试,发现我的假设得到了证实。
我的问题是:
- 我的假设对于 Visual C++ 2008/2010/11 (windows) 是否合理?
- 对于 gcc 4.* (linux)?
- 对于编译器标志的任何组合?
- 你知道这个假设不成立的任何编译器/平台吗?
我猜编译器可能会为结构添加一些填充,例如用于调试目的。但是有没有真正做到这一点的编译器?
编辑:所以正如你在这里问的是我想要实现的:
我有具有以下签名的成员函数:
Someclass* OtherClass::fn();
我想像这样更改签名:
Wrapper<Someclass> OtherClass::fn();
这个包装器就像一些智能指针一样,即它关心指针的生命周期,因此当它超出范围时它会释放它。由于跨 dll 边界调用该函数,我想确保返回的值(现在是一个具体类型,而不仅仅是一个哑指针)在所有情况下(即编译器设置等)与指针大小相同将会。计划/希望是支持调试/发布应用程序/dll 构建的所有组合。
您可能会问:不,我不能使用 boost::shared_ptr<>、std::shared_ptr<>、std::unique_ptr<> 等,因为我们不想将 boost 暴露给 dll 用户,我们还不支持 C++11。