我遇到了使用boost异常的限制和带有零参数的make_tuple。基本上我有一个像这样的宏:
#define MAKE_EXCEPT( msg, ... ) exception( msg ) << make_tuple(__VAR_ARGS__)
变量参数将是各种error_info类型。 上面的内容从完整的宏中简化了,我刚刚拉出来让我遇到麻烦。
问题在于,如果没有参数,我会收到错误,而不是为所涉及的类型定义的operator<<
。也就是说,虽然make_tuple()
定义得很好(我甚至在别处使用过),但带有异常的重载在这里不起作用。
我现在正在寻找解决方法。因此,不是直接使用运算符,而是将其包装在函数中:
#define MAKE_EXCEPT( msg, ... ) make_except( exception( msg ), make_tuple(__VAR_ARGS__) )
现在,问题是如何专门化这个功能?我需要一个适用于普通元组的版本和一个带有null_tuple的版本。
答案 0 :(得分:1)
我发现了一些有用的东西。这似乎过于复杂。也许其他人有更好/更简单的解决方案。
在此代码make_except
中称为error_with_tags
template<typename E, typename T,int CNT>
struct error_with_tags_helper
{
E const & operator()( E const & x, T const & t )
{
x << t;
return x;
}
};
template<typename E, typename T>
struct error_with_tags_helper<E,T,0>
{
E const & operator()( E const & x, T const & t )
{
return x;
}
};
template<typename E, typename T>
inline E const & error_with_tags( E const & x, T const & t )
{
error_with_tags_helper<E,T,boost::tuples::length<T>::value> et;
return et(x,t);
}