[英]How to call proper assignment operator of custom class inside std::variant
我有以下 class:
class StackStringHolder
{
public:
StackStringHolder& operator=(const std::string& str)
{
str_ = str;
return *this;
}
StackStringHolder& operator=(std::string&& str)
{
str_ = std::move(str);
return *this;
}
const std::string& get() const { return str_; }
private:
std::string str_;
};
我想通过以下方式在std::variant
中使用它:
int main() {
std::variant<int, StackStringHolder> var;
var = 5;
std::string str = "Hello";
var = str; // error
var = std::move(str); // error
}
但是编译器(MSVS2022)说:
错误 C2679:二进制“=”:未找到采用“std::string”类型的右侧操作数的运算符(或没有可接受的转换)
更新,我确信我的代码已经足够了,但正如我被要求的那样,这里是完整的例子:
#include <string>
#include <variant>
class StackStringHolder
{
public:
StackStringHolder& operator=(const std::string& str)
{
str_ = str;
return *this;
}
StackStringHolder& operator=(std::string&& str)
{
str_ = std::move(str);
return *this;
}
const std::string& get() const { return str_; }
private:
std::string str_;
};
int main() {
std::variant<int, StackStringHolder> var;
var = 5;
std::string str = "Hello";
var = str; // error
var = std::move(str); // error
return 0;
}
您的var
可以保存一个int
或一个StackStringHolder
,因此您不能简单地用std::string
分配它。
但是,您可以向接受std::string
的 class StackStringHolder
添加一个转换构造函数。
然后它可以用于将str
转换为StackStringHolder
并将其分配给var
。
您的转换构造函数可能类似于:
StackStringHolder(std::string const& str)
: str_(str)
{}
现在您可以使用:
var = str;
var = std::move(str);
variant::operator=
会调用构造函数来构造替代类型,所以需要为StackStringHolder
提供对应的构造函数
class StackStringHolder
{
public:
StackStringHolder(const std::string& str) : str_(str) { }
StackStringHolder(std::string&& str) : str_(std::move(str)) { }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.