C++ で実装された、いくつかのインプリメンター クラス (impl) とユーザー用のラッパーがあります。impl とラッパーを 2 つの異なるタプルに保持して、1 つの割り当てで impl を初期化できるようにしたいと考えています。(他にも理由があります:)。
問題は、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がないのはなぜですか?背後にある主な理由を意味します。
要約すると、単一のアクション (つまり、make_shared) で割り当てることができるように、すべての impl とラッパーをタプルにまとめる必要があります。コンパイル時に型で検索できるようにいくつかのヘルパーを作成したため、タプルはやや必須です (例: Get<A<int>>(w)
) (3) 各 impl を個別に割り当てる必要がないように、impl への参照を保持するきちんとした方法はありますか? .