[英]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.