【问题标题】:C++ variadic macro and templateC++ 可变参数宏和模板
【发布时间】:2013-06-16 06:58:04
【问题描述】:

我在玩可变参数宏和模板。有没有简单的方法来实现以下?

这就像 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);

【问题讨论】:

    标签: c++ variadic-templates variadic-macros


    【解决方案1】:

    使用函数模板有什么问题?

        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 来声明适当类型的变量。

    【讨论】:

      【解决方案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 的工作方式相同。 ma​​ke_my_class 正在接收右值引用并转发到 my_class 构造函数。 ma​​ke_my_class 的返回值也应该默认为右值。我认为这种构造方法应该是零开销。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多