我有一些实现类(impls)和一些用 C++ 实现的用户包装器。我想将 impls 和 wrappers 保存在两个不同的元组中,以便我可以通过单个分配来初始化我的 impls。(我也有其他原因:)。
问题是 Visual Studio 2012 标准库的元组类不允许我在没有 const 引用的包装器复制构造函数的情况下构造我的包装器元组。可悲的是,在这种情况下我需要 const_cast ,例如:
#include <iostream>
#include <type_traits>
#include <tuple>
#include <typeinfo>
template <typename Member>
struct A
{
A(Member& m) : member(m)
{ std::cout << typeid(Member).name() << " MMBR " << member << std::endl; }
A(const Member& m) : member(const_cast<Member&>(m))
{ std::cout << typeid(Member).name() << " CMBR " << member << std::endl; }
void Print()
{
std::cout << typeid(Member).name() << " PRNT " << member << std::endl;
}
Member& member;//yes I need to hold this as a mutable reference
};
int main()
{
typedef std::tuple<A<int>, A<double>, A<short>> WrapperTuple;
typedef std::tuple<int, double, short> Tuple;
Tuple t(0, 1, 2);
WrapperTuple w(t);
std::get<1>(w).Print();
return std::cin.get();
}
上面的代码按预期编译和运行,但是如果我删除/注释掉包装类 A 的 const-ref-ctor,我的 VS2012 编译器和我的 gcc4.7.2 编译器都不会编译代码。(1)我做错了什么?
由于我没有关于 c++11 的良好文档,我猜想元组的可变参数复制 ctor 只需要其他元组的 const ref。如果是这样,(2)为什么元组类没有这样的ctor?我的意思是背后的主要原因。
总而言之,我想将所有 impls 和包装器放在一个元组中,这样我就可以使用单个操作(即 make_shared)进行分配。元组是必须的,因为我已经编写了一些帮助程序,以便我可以在编译时按类型查找(例如Get<A<int>>(w)
)(3)是否有一种简洁的方法来保存对 impl 的引用,这样我就不需要分别分配每个 impl .