2017-03-27 6 views
-3

私はこれを達成するためにテンプレートマジックを使用することができますが、私はどのようにわからないのですか?パラメータに基づいてコンパイラジェネリックマップタイプを返すC++関数?

std::map<int,int,std::less> forward_map; 
std::map<int,int,std::greater> reverse_map; 

?? choose(bool forward) 
{ 
    return forward_map ? forward : reverse_map; 
} 
+0

機能は、単一の戻り値の型を持っている必要があります、あなたは間違っている変数 – Jonas

+2

チェックしているあなたの 'return'文を確認してください – perreal

+0

Aの代わりに高階関数を使用します関数はコンパイル時に固定の戻り値型を持たなければなりません。実行時に変更することはできません。 –

答えて

0

同じ関数から異なる型を返すことはできません。

template <typename TF> 
decltype(auto) choose(bool forward, TF&& f) 
{ 
    return forward ? f(forward_map) : f(reverse_map); 
} 

例:

choose(true, [](auto& m){ /* `m` here is a `forward_map` */ }); 
choose(false, [](auto& m){ /* `m` here is a `reverse_map` */ }); 
+0

これは完璧です、ありがとう –

+0

@LukeAndreson:ようこそ。あなたの質問に答えたように感じたら私の答えを受け入れることを忘れないでください。 –

0

あなたは:の両側で同じ型を返す必要があります式として三項演算子を使用できるようにするつもりはありません。また、別のパスにあるものを返す関数を持つことはできません。

これでできるのは、非タイプのテンプレートを使用してboolタイプを使用し、そのテンプレートをtrueとfalseに特化することです。これにより、同じ関数名で異なる戻り値の型を持つことができます。それはあなたに

template <bool forward> auto make_map(); 
template <> auto make_map<true>() { return std::map<int,int,std::less<int>>{}; } 
template <> auto make_map<false>() { return std::map<int,int,std::greater<int>>{}; } 

を与えるだろう行うと、あなたはこれで

int main() 
{ 
    auto map = make_map<true>(); 
    auto reverse_map = make_map<false>(); 
} 

だけの問題のようにそれを使用すると、テンプレートパラメータはコンパイル時に知られなければならないです。

関連する問題