私の目標は、含まれているすべての update() メソッドを最小限のオーバーヘッドで連続して呼び出すことができるメソッド void 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;
};
コードがコンパイルされ、テストが期待どおりに実行されます。私の質問は、ExecSet::update() が内部で行われるすべての再帰呼び出しとともに完全にインライン化されることを 100% 確信できるでしょうか? これはすべてコンパイル時に決定されるため、そうすべきだと思います。そして -O3 の下では、すべてがインライン化されているはずですよね?