您能否帮我弄清楚为什么这不起作用,即参考代码中的注释//I need to do this but I can't. I thought this the goal!
?我不知道为什么这不起作用,它的灵感来自我在网上看到的例子。
#include <variant>
#include <iostream>
template<typename... args>
class Visitor //: public boost_base_visitor<double>...
{
public:
virtual ~Visitor() = default;
virtual double visit(typename std::variant<args...> visitable)
{
auto op = [this](typename std::variant<args...> visitable) -> double { return this->apply(visitable); };
return std::visit(std::ref(op), visitable);
}
virtual double apply(typename std::variant<args...> visitable) = 0;
Visitor() = default;
};
class SubVisitor : public Visitor<std::string, double>
{
public:
virtual ~SubVisitor() = default;
SubVisitor() : Visitor<std::string, double>() {};
virtual double apply(std::variant<std::string, double> visitable) override
{
//return process(visitable); //I need to do this but I can't. I thought this the goal!
return process(std::get<std::string>(visitable)); //I DON'T KNOW IF THIS IS REALLY A STRING??
};
virtual double process(std::string visitable)
{
std::cout << "STRING HANDLED" << std::endl;
return 0.0;
}
virtual double process(double visitable)
{
std::cout << "DOUBLE HANDLED" << std::endl;
return 1.0;
}
};
int main(int argc, char* argv[])
{
SubVisitor v;
v.apply("dd");
//v.apply(1.0); //This will fail as we only handle string?? What is the purpose of variant then?
return 1;
}
取消注释时出现错误process
上面的函数:
错误 C2664:“double SubVisitor::process(std::string)”:无法转换
参数 1 从 'std::variantstd::string,double' 到 'std::string'
您可以使用std:visit
对变体进行操作
class SubVisitor{
virtual double apply(std::variant<std::string, double> visitable) override
{
// std::visit expect `operator()`, not `process`
// so wrap `this` inside a lambda here
return std::visit(
[this](auto&& v){return process(v);},
visitable
);
};
}
或者如果您愿意,您也可以手动检查类型
class SubVisitor{
virtual double apply(std::variant<std::string, double> visitable) override
{
if(auto* s = std::get_if<std::string>(&visitable))
return process(*s);
else if(auto* d = std::get_if<double>(&visitable))
return process(*d);
throw std::bad_variant_access();
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)