如果T可能是void,我该如何在boost中安全地获取sizeof(T)?

4

我正在努力弄清楚如何编译一些代码,以确定T函数原型的返回值大小,在我的函数模板中。

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,例如if_或apply_if,以及这些是否起作用。
谢谢。
1个回答

11

您可以使用自己的元函数

template<typename T>
struct get_size { static const size_t value = sizeof(T); };

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

2
更好的做法是,他可以说value = void_has_no_size(),这将使编译器抱怨没有名为void_has_no_size()的函数。 - Paul Manta
6
OP的意愿是将void转换为0。 - Sebastian Mach
2
@curiousguy 当你知道你的模板与某种类型无法正确运行时,你可以使其无法编译该特定类型。 - Paul Manta
1
@curiousguy:考虑使用static_assert - John Dibling
1
@curiousguy,请查看boost::noncopyableBOOST_STATIC_ASSERT - 它们可以防止编译并使用一些有意义的名称标识符来产生可读的错误。请不要在此处添加评论,创建新问题或聊天室。 - Abyx
显示剩余17条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接