c++ - 可变参数模板中的编译时递归

标签 c++ c++11 variadic-templates template-meta-programming

我的目标是创建一个包含由类组成的元组的类,所有这些类都有一个 void update() 方法,它允许以最小的开销连续调用所有包含的 update() 方法。这是我的代码:

template< typename... Tel >
class ExecSet
{
private:
  std::tuple<Tel...> m_data;

   //Compile-time Recursive
   template<int _iter, typename _Head, typename... _Tail>
   inline void _update()
   {
     std::get<_iter>(m_data).update();
     _update< _iter + 1, _Tail... >();
   }

   //Base case
   template<int _iter>
   inline void _update()
   {
     //Do nothing here
   }

public:
   inline void update()
   {
     _update<0, Tel...>();
   }
};

class Foo
{
//..
inline void update()
  {
    std::cout << "An update of Foo " << m_i << "\n";
  }

  private:
  int m_i;
};

class Bar
{
//..
inline void update()
  {
    std::cout << "An update of Bar " << m_i << "\n";
  }

  private:
  int m_i;
};

代码编译并按预期执行测试。我的问题是,我能否 100% 确定 ExecSet::update() 将与内部进行的每个递归调用一起完全内联?我想它应该是因为这都是在编译时确定的。在 -O3 下一切都应该内联,对吗?

最佳答案

不,你不能。 C++ 标准不保证函数被内联,即使您添加了 inline 说明符也是如此。

关于c++ - 可变参数模板中的编译时递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17763751/

相关文章:

c++ - 访问各种类型的可变参数模板

c# - 将 C++ 函数重写为 C#(将指针传递给数组中的下一个元素)

c++ - 这是 GCC 错误吗?使用 union 初始化结构

c++ - 初始化指向多维数组的动态指针的正确方法?

c++ - 模板参数包 : How to create a Tuple of an independent type with same length

c++ - 为什么这个模板类没有编译?

c++ - if 语句后跟 return 0

c++ - LNK2005,MSVC2010 中的 "already defined error"链接器错误

c++ - 为什么 boost::asio::io_service 不能用 std::bind 编译?

c++ - 使用 std::initializer_list 构造函数而不产生歧义?