簡體   English   中英

如何在 std::variant 中調用自定義 class 的正確賦值運算符

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM