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)...获取args. 函数模板通过其隐式模板推导绕过了所有这些,而auto关键字意味着您不必知道要传递什么类型my_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 回答