2017-08-20 10 views
3

セイを簡素化するために使用する方法を、私は、私のクラスの一つに、コードのこの部分を持っているC++ decltype変数定義

  • キーのマップと他のマップ
  • 2番目のマップが別であるが定義されていますキーとファンクションハンドラ
  • 機能投手は2つのparams

今、変数を定義するための署名は信じられないほどに見えるをとる署名があります。

std::map<std::string, std::map<std::string, 
    std::function<void(std::shared_ptr<HTTPRequest>, 
     std::shared_ptr<HTTPResponse>)>>> routeFunctions_; 

私は最近decltypeについて知りましたが、これを正しく使用できませんでした。

decltype(x) routeFunctions_; // What should be there in the place of x ? 
+4

? 'typedef'または' using'のどちらかを使用していますか?たとえば、 'request_ptr = std :: shared_ptr ;を使用しています。次に、これらのタイプエイリアスをより広範なタイプのエイリアスに結合します。 'route_type routeFunctions_;'ここで 'decltype'は必要ありません。 –

+0

'x'は、必要な型の結果を持つ式か、必要な型の別の変数の名前を持つ式になります。式が参照を生成するならば、 'decltype'もそうであることに注意してください。 – Peter

+0

私はこの提案と一緒に行くべきだと思います。さらに、decltype()は、割り当てがある場合にのみ便利です。私はこれらの新機能をまだ探っているので間違っているかもしれません。 –

答えて

3
  • 使用typedef、あなたは多くの場合、それの変数を宣言した場合。
  • 関数からこの型の値を返す場合は、autoまたはdecltypeを使用します。
  • 構造体/クラスメンバーのタイプを取得する場合は、decltypeを使用します。この記事では

ルック:この場合

http://en.cppreference.com/w/cpp/language/auto http://en.cppreference.com/w/cpp/language/decltype

http://www.cprogramming.com/c++11/c++11-auto-decltype-return-value-after-function.html

あなたの選択はtypedefです:

型のエイリアスを使用しないのはなぜ
typedef std::map<std::string, std::map<std::string, 
std::function<void(std::shared_ptr<HTTPRequest>, 
std::shared_ptr<HTTPResponse>)>>> RouteFunctionsContainer; 

RouteFunctionsContainer routeFunctions_; 
0

新しい変数を追加する変数と同じ型の変数名をそこに配置します。あなたは、変数の型のようなふりをすることができ

int x = 3; 
decltype(x) y = 5; // y is an int because x is an int 

は、構文的にソースコード内のdecltypeに代入されます。ライブ

:このタイプのhttps://godbolt.org/g/6uzoJH

+0

変数が割り当てられている場合にのみ、decltype(..)が便利ですか?代入がないケース(鉱山など)はどうでしょうか?しかし宣言だけです。 –

+0

@Mupparthy - あなたはすでに正しいタイプのものを見つけなければなりません。このようなマップを初めて使用する場合、 'decltype'はあなたを助けません。 –