使用零长度元组提升异常,如何解决方法

时间:2012-01-10 08:55:10

标签: c++ boost

我遇到了使用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的版本。

1 个答案:

答案 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);
}