1

可変長マクロとテンプレートで遊んでいます。以下を達成する簡単な方法はありますか?

std::make_tuple のようなものです。make_my_class を実装するには? おそらく「std::decay」が必要だと思いましたが、よくわかりません。よろしくお願いします。

template <typename... Args>
class my_class
{
public:
   my_class(Args... args)
      : items_(args...)
   {
   }

private:
   std::tuple<Args...> items_;
};

// How to fix this line?
#define CREATE_MY_CLASS(var_name, args...) my_class<decltype(args...)> var_name(args...);

// Usage:
// CREATE_MY_CLASS(xyz, 1, 2, 3)

// Target:
// my_class<decltype(1), decltype(2), decltype(3)> xyz(1, 2, 3);
4

2 に答える 2

2

関数テンプレートを使用することの何が問題になっていますか?

    template <typename ... Args>
    my_class<Args...> get_my_class(Args&&...args)
    {
        return my_class<Args...>(std::forward<Args>(args)...);
    }

    auto x = get_my_class(1,2,3,4,5,6);

マクロの可変引数を使用するには必要であり、 の型のリストを取得するために何かを行う必要があるため、__VA_ARGS__それを に渡す方法または渡すことができるかどうかはわかりません。関数テンプレートは、その暗黙的なテンプレート演繹でそのすべてをバイパスします。キーワードは、適切な型の変数を宣言するために、どの型が渡されているかを知る必要がないことを意味します。decltype()decltype(args)...argsautomy_class

于 2013-06-16T07:11:17.717 に答える
2

次のように実行できます。

#include <iostream>
#include <tuple>
#include <utility>

// my_class declaration
// ...


template <typename... Args>
my_class<Args...> make_my_class(Args&&... args) {
   return my_class<Args...>( std::forward<Args>(args)... );
}

int main() {
   auto f = make_my_class(1,2);
}

少し説明: これはstd::make_pairと同じように機能します。make_my_classは右辺値参照を受け取り、 my_classコンストラクターに転送しています。make_my_classからの戻り値も、​​デフォルトで右辺値にする必要があります。このような構築方法では、オーバーヘッドはゼロであるべきだと思います。

于 2013-06-16T07:16:42.767 に答える