c++ - 有没有办法为容器类型创建运算符/函数重载

标签 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
}

但当我尝试输入 std::liststd::vector 时,它不起作用导致 no viable overload 错误。

那么,如何修复它,是否可以使用这种重载?

最佳答案

is_iterable<TContainer>::value是真的,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

关于c++ - 有没有办法为容器类型创建运算符/函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52008689/

相关文章:

C++ 在不知道其参数的情况下保留对模板实例的引用

c++ - 即使启用了 Wextra,gcc 也不会给出比较无符号整数 < 0 的警告

c++ - 如何在 Qt .pro 文件中添加宏定义

c++ - 如何专门化模板类中的赋值运算符?

c++ - 将错误与模板函数中的局部派生对象链接起来

c++ - 调用 ADL 时,表达式和 namespace 之间是否会发生冲突?

c++ - 在嵌套命名空间中转发声明

c++ - 帮助,澄清我对不合格名称查找 :ISO n3290 Draft 的疑问

C++ 模板 : "type/value mismatch at argument" and "expected a constant type of int, got int"

C++ 指向方法模板的推导在面向 x86 时无法编译,但适用于 x64