我正在研究以下的 C 20 實作tuple:
template<size_t INDEX, typename T>
struct wrap { [[no_unique_address]] T data {}; };
template<typename...>
class base {};
template<size_t... INDEX, typename... Ts>
class base<index_sequence<INDEX...>, Ts...> : public wrap<INDEX, Ts>... {
public:
constexpr base( const Ts &... args ) : /* !! HERE SHALL THE MAGIC COME */ {}
};
template<typename... Ts>
class tuple : public base<index_sequence_for<Ts...>, Ts...> {
public:
/* Inherit base constructors */
using base<index_sequence_for<Ts...>, Ts...>::base;
};
我的問題是:如何正確實作代碼而不是/* !! HERE SHALL THE MAGIC COME */呼叫 base, 意味著wrap<>建構式 -wrap復制建構式采用T(從base的模板可變引數包擴展)的相應實體Ts保持args?
在此先感謝任何愿意提供幫助的人。
uj5u.com熱心網友回復:
引數包擴展也適用于成員初始值設定項串列,因此您可以簡單地執行以下操作:
template<size_t INDEX, typename T>
struct wrap { [[no_unique_address]] T data {}; };
template<typename...>
class base {};
template<size_t... INDEX, typename... Ts>
class base<std::index_sequence<INDEX...>, Ts...> : public wrap<INDEX, Ts>... {
public:
constexpr base(const Ts&... args) : wrap<INDEX, Ts>{args}... {}
};
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375304.html
上一篇:模板非型別模板引數
