【发布时间】:2017-10-20 15:14:38
【问题描述】:
我有一个拥有 unique_ptr 的对象,因此如果不进行深度复制(我不想要),就无法复制构造。
我想让 std::any 持有该对象,但我发现的唯一选择是让 std::any 持有一个指针,这增加了无用的间接性,或者让我的对象具有唯一性点。下面的代码有望说明我的观点:
//Compiled with clang++ -std=c++2a; clang version 5.0.0
#include <iostream>
#include <any>
#include <memory>
struct A {
std::unique_ptr<int> m = std::make_unique<int>(11);
A(A&& a): m(std::move(a.m)) {}
A() {}
};
struct B {
std::shared_ptr<int> m = std::make_shared<int>(11);
};
template<class T>
void use_any_ptr() {
std::any a{new T{}};
std::cout << *(std::any_cast<T*>(a)->m) << std::endl;
}
template<class T>
void use_any() {
std::any a{T{}};
std::cout << *(std::any_cast<T>(a).m) << std::endl;
}
int main() {
use_any_ptr<A>(); // Workaround using a pointer
use_any<B>(); // Workaround using shared pointer
use_any<A>(); // Breaks because A has no cc no matching constructor for initialization of 'std::any'
}
据我了解 std::any 的构造似乎需要复制对象,但是我不确定为什么不能简单地移动对象。
有没有办法解决这个问题?也就是说,除了使用 shared_ptr 之外,这意味着我基本上是在表达“错误的事情”,以便创建任何对象或传递 std::any 指针(这是一个不需要的间接级别,因为 std::据我所知,any 持有一个指向类型的 void 指针)。
是否有任何不同的实现可以在创建时使用移动 ctr 而不是复制 ctr?
还是我很傻,不理解这里的“真正”问题?
【问题讨论】:
标签: c++ templates c++17 template-meta-programming