【发布时间】:2020-08-13 12:34:18
【问题描述】:
我正在尝试创建一个访问者函数,它将我的boost::variant 的值相加。我在类型不同的情况下使用模板,例如int + float
typedef boost::variant<int, float> Values;
struct Add : public boost::static_visitor<Values> {
template <typename T, typename U>
auto operator() (T a, U b) const -> decltype(a + b) {
return a + b;
}
}
这编译和工作正常
std::cout << boost::apply_visitor(Add{}, (Values)2, (Values)5) << std::endl;
std::cout << boost::apply_visitor(Add{}, (Values)2, (Values)5.123) << std::endl;
7
7.123
不过,我还想将std::string 添加到Values 变体中,这样我也可以将字符串加在一起。我知道例如 string + int 是不可能的,但我会确保 Values 在尝试通过访问者运行它们之前都是一个字符串。
typedef boost::variant<int, float, std::string> Values;
std::cout << boost::apply_visitor(Add{}, (Values)"hello", (Values)"world") << std::endl;
但是程序没有编译,给我错误:
无法专门化函数模板'unknown-type Add::operator ()(T,U) const'
我知道std::string 是一个对象而不是一个类型,因此这种错误是有道理的,所以我试图通过在Add 结构中重载operator 来创建一个特殊情况都是字符串:
auto operator() (std::string a, std::string b) const {
return a + b;
}
但是我得到了错误
std::basic_string,std::allocator> Add::operator ()(std::string,std::string) const': 无法将参数 1 从 'T' 转换为 'std::string'
看起来它仍在尝试通过模板化访问者运行字符串参数。我哪里错了?有没有更好的方法来实现我想要做的事情?抱歉,如果答案很明显,我对 C++、boost 和模板还是很陌生。
【问题讨论】:
标签: c++ templates boost operator-overloading sfinae