1

只有修改而不是替换存储的对象的方法std::any是声明可变数据可变吗?例如,为了避免创建和复制 S 类实例:

#include <iostream>
#include <vector>
#include <any>
#include <string>
    
struct S {
    mutable std::string str;
    
    S(S&& arg) : str(std::move(arg.str)) { std::cout << ">> S moved" << std::endl; }
    S(const S& arg) : str(arg.str) { std::cout << ">> S copied" << std::endl; }
    S(const char *s) : str(s) { std::cout << ">> S created" << std::endl; }
    
    S& operator= (const S& arg) { str = arg.str; return *this; }
    S& operator= (S&& arg) { str = std::move(arg.str); return *this; }
    virtual ~S() { std::cout << "<< S destroyed" << std::endl; }
};


int main() {
    std::vector<std::any> container;

    container.emplace_back(S("Test 1"));
    
    std::any_cast<const S&>(container[0]).str = "Test 2";
    
    for (const auto& a : container) {
        std::cout << a.type().name() << ", " 
                  << std::any_cast<const S&>(a).str << std::endl;
    }
}
4

2 回答 2

4

您可以使用非常量引用进行 any_cast:

std::any_cast<S&>(container[0]).str = "Test 2";

演示

或者

std::any a = 40;

std::any_cast<int&>(a) += 2;
std::cout << std::any_cast<int>(a) <<std::endl;

演示

于 2021-01-07T09:12:01.923 回答
0

不。

问题就在这里。

std::any_cast<const S&>(container[0]).str = "Test 2";

您正在尝试更改常量数据

于 2021-01-07T08:53:02.087 回答