如何在不使用宏的情况下实例化struct而获取struct成员的大小?

时间:2014-05-20 18:08:03

标签: c++ templates

我现在没有可用的C ++环境,同事想要一些关于如何用模板函数替换下面的宏的建议,

#define member_sizeof(T,F) sizeof(((T *)0)->F)

到目前为止,我得到了这个;

struct X { int x; double z; }; 
template<class T> inline T member_size(); 
int main() 
{    
    std::cout << sizeof(member_size<X>().x) << std::endl; 
    std::cout << sizeof(member_size<X>().z) << std::endl;
    return 0; 
}

但目标是让sizeof()成员无需实例化struct

它必须与 C ++国际标准,ISO IS 14882:2003 ,不幸的是没有C ++ 11一起使用。

如果有,那么等效的模板解决方案是什么?

2 个答案:

答案 0 :(得分:6)

在C ++ 11中,可以直接编写sizeof(T::F),其中T是类型,F是成员的名称。所以不需要宏。

在C ++ 03中,这是不允许的(§5.1/ 10)。据我所知,宏是最好的方法。成员的名字本身毫无意义;你需要它所属的类,或者该类的一个对象,并且所有的构造都很笨拙,所以最好只定义一个宏,就像你拥有的那样。

答案 1 :(得分:0)

有人意外被禁止:

  

不,模板不能简单地接受成员名称。使用SFINAE here进行预处理器元编程和TMP有一个邪恶的解决方法,但它只是明显的邪恶和不可读,恕我直言,简单的宏似乎是一个不错的选择。