21xrx.com
2024-11-08 21:16:56 Friday
登录
文章检索 我的文章 写文章
C++11的可变参数模板
2023-06-29 03:35:43 深夜i     --     --
C++11 可变参数模板 变参模板 模板元编程 参数包

C++11中引入了可变参数模板,允许我们在一个函数或者类模板中传递任意数量任意类型的参数,并且使用这些参数进行操作。这个特性在某些场合下非常有用,比如编写一个通用的日志库或者实现一个通用的数据结构。

可变参数模板的基本语法是在模板参数列表中使用省略号(`...`),并在函数体或类模板中使用模板参数展开运算符(`...`)来操作参数列表。

例如,下面的代码定义了一个函数模板`print`,它可以输出任意数量任意类型的参数:


template<typename T, typename... Args>

void print(const T& first, const Args&... args)

{

  std::cout << first;

  if constexpr (sizeof...(Args) > 0) {

    print(args...);

  }

}

在这个例子中,我们使用了递归调用来处理参数列表。首先输出第一个参数,然后通过展开运算符(`...`)将剩余的参数继续传递给`print`函数,直到参数列表为空为止。

我们可以用`print`函数输出任意数量任意类型的参数,例如:


print(1, "Hello World", 3.14, 'a');

这会输出:


1Hello World3.14a

除了函数模板,我们还可以使用可变参数模板来定义类模板。例如,下面的代码定义了一个泛型的栈(stack)数据结构,它可以存储任意数量任意类型的元素:


template<typename... T>

class Stack

{

public:

  void push(const T&... args)

  {

    (m_data.push_back(args), ...);

  }

  void pop()

  {

    m_data.pop_back();

  }

  const T& top() const

  {

    return m_data.back();

  }

  bool empty() const

  {

    return m_data.empty();

  }

private:

  std::vector<T...> m_data;

};

这个栈类中使用了模板参数展开运算符(`...`)来定义泛型的`vector`,并使用逗号运算符来在一行中依次将元素插入到`vector`中。我们可以像下面这样使用这个栈类:


Stack<int, std::string, double> s;

s.push(1, "Hello", 3.14);

s.push(2, "World", 2.71);

while (!s.empty()) {

  std::cout << s.top() << std::endl;

  s.pop();

}

这会输出:


2 World 2.71

1 Hello 3.14

可变参数模板是C++11中非常有用的一个新特性。通过使用可变参数模板,我们可以编写更加通用、灵活的代码,使我们的代码更具可扩展性和复用性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复