有没有一种方法可以为容器类型创建操作符/函数重载

时间:2018-08-24 16:44:26

标签: c++ c++11 templates

我有一些类似的课程:

class A {
A& operator=(const A& a);
A& operator=(const int a);
A& operator=(const std::string& a);
};

我为可迭代的is_iterable设置了类型特征; 如何为可迭代类型的operator=实现重载?

我的方法:

template<typename TContainer, std::enable_if_t<is_iterable<TContainer>::value>>
A& operator=(const TContainer& val) {
// do stuff
}

,但是当我尝试喂no viable overloadstd::list时,它不起作用,导致std::vector错误。

那么,如何解决它,是否有可能使用这种重载?

2 个答案:

答案 0 :(得分:4)

is_iterable<TContainer>::value为true时,std::enable_if_t<is_iterable<TContainer>::value>void,这不是有效的非类型模板参数。将您的容器重载定义为

template<typename TContainer,
         std::enable_if_t<is_iterable<TContainer>{}, int*> = nullptr>
A& operator=(const TContainer&)

Live demo

答案 1 :(得分:0)

不确定是不是您要的东西,但我相信:

template<typename TContainer>
A& operator=(const TContainer& container) {
    for (auto it = container.begin(); it != container.end(); it++) {
        // do stuff
    }
    return *this;
}

仅当其他重载与类型feed不匹配时,才会调用模板。如果类型不可迭代,则在调用begin()end()时会发生错误。