我现在没有可用的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一起使用。
答案 0 :(得分:6)
在C ++ 11中,可以直接编写sizeof(T::F)
,其中T
是类型,F
是成员的名称。所以不需要宏。
在C ++ 03中,这是不允许的(§5.1/ 10)。据我所知,宏是最好的方法。成员的名字本身毫无意义;你需要它所属的类,或者该类的一个对象,并且所有的构造都很笨拙,所以最好只定义一个宏,就像你拥有的那样。
答案 1 :(得分:0)
有人意外被禁止:
不,模板不能简单地接受成员名称。使用SFINAE here进行预处理器元编程和TMP有一个邪恶的解决方法,但它只是明显的邪恶和不可读,恕我直言,简单的宏似乎是一个不错的选择。