在函数内加载名称空间符号以进行模板实例化

时间:2011-10-18 01:56:15

标签: c++ templates boost namespaces boost-range

我编写了一个templacised operator+=函数,并赋予它一个独特的命名空间(我有时只想使用它,这让我很有用)。

我想在其操作数上使用operator+=的另一个模板函数中使用那个函数,但我不想让它在符号表中等待等待突击我在我的程序中的任何地方进行的+=次呼叫。我还必须在广泛包含的标题内执行此操作。

这方面的一个基本例子是:

#define BOOST_RESULT_OF_USE_DECLTYPE

#include "boost\range.hpp"
#include "boost\range\algorithm.hpp"
#include <vector>

using std::vector;

namespace range_ops
{
    template <class ForwardRange1, class SinglePassRange2>
    inline ForwardRange1& operator+=(ForwardRange1& left, const SinglePassRange2& right)
    {
        auto left_it = boost::begin(left);
        auto right_it = boost::begin(right);
        for (; left_it != boost::end(left); ++left_it, ++right_it)
            *left_it += *right_it;

        return left;
    }
}

template <class SinglePassRange, class Value>
inline Value accumulate_increment(SinglePassRange& rng, Value val)
{
    typedef typename boost::range_value<SinglePassRange>::type range_val;
    boost::for_each(rng, [&](const range_val& x) { val += x; });
    return val;
}

template <class SinglePassRange>
inline typename boost::range_value<SinglePassRange>::type accumulate_increment(SinglePassRange& rng)
{
    return accumulate_increment(rng, typename boost::range_value<SinglePassRange>::type());
}

//using range_ops::operator+=; // this works, but pollutes the global namespace with a templacised operator+= function - yuck!
int main()
{
    auto i = accumulate_increment(vector<int>(1)); // works fine

    using range_ops::operator+=; // want this here, but accumulate_increment can't see the operator+= function
    auto j = accumulate_increment(vector<vector<int>>(1));
}

有没有办法达到这个结果?

2 个答案:

答案 0 :(得分:0)

只有一个递增函数,所以你怎么指望你在调用者中使用子句来影响递增函数本身 - 它应该如何找到operatior +?

答案 1 :(得分:0)

即使你能做到这一点,我也不会推荐它。有人使用你的代码应该期望一个对象的内部行为不依赖于一些未明确传递给它的外部状态(你的命名空间设置)而不会随之移动(不是取决于它在地理位置上的位置)在源文件中)。

运算符重载已经成为一个让事情变得混乱的功能,除非操作数通常不支持该运算符。

如果你要实现这样的东西,你应该通过设置改变你重载的运算符行为的对象的状态来做到这一点,例如成员SetOtherOperatorOverload(TRUE);