我有一些类似的课程:
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 overload
或std::list
时,它不起作用,导致std::vector
错误。
那么,如何解决它,是否有可能使用这种重载?
答案 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&)
答案 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()
时会发生错误。