关于C#:如果T可以为空,我如何安全地获得sizeof(T)?

How do I get the sizeof(T) safely in boost if T can be void?

我试图弄清楚如何获取一些代码,这些代码将确定函数模板中T的返回值的大小,其中T是函数原型。

1
2
3
4
5
6
7
8
template<typename T>
void functionReturnLength()
{
long lReturnTypeSize = boost::mpl::eval_if<
    boost::is_void<boost::function_types::result_type< T >::type>::value,
    boost::mpl::long_<0>,
    boost::mpl::long_<boost::mpl::sizeof_<boost::function_types::result_type< T >::type>::value>>::value;
}

但是它仍然无法编译,因为sizeof(void)不是有效的操作-即使我试图构造一个if语句,如果该类型为void也会返回大小为0。我是BOOST MPL的新手,因此,尽管我浏览文档已有一段时间,但是我不确定如何应用if_或apply_if之类的其他if,以及这些方法是否还能工作。

谢谢。


您可以使用自己的元功能

1
2
3
4
5
template<typename T>
struct get_size { static const size_t value = sizeof(T); };

template<>
struct get_size<void> { static const size_t value = 0; };