2017-01-10 62 views
4

今天我試圖創建一個具有一點特定的元組(至少對我來說)和編譯時。創建一個包含variatic類型的元組

我有一些基本的結構,讓說:

struct Foo1 { int data; }; 
struct Foo2 { int data; }; 
struct Foo3 { int data; }; 

而另一個結構,但與一些模板的東西:

template < typename T, 
      size_t Size > 
struct Metadata { 

    using type = T; 

    std::bitset<Size> bitset; 
}; 

所以現在我要創造這樣的元組:

constexpr std::tuple<Metadata<Foo1, 3>, Metadata<Foo2, 3>, Metadata<Foo3, 3>> test { {0}, {0}, {0}}; 

但以自動方式,更像是:

template < typename ... Ts > 
constexpr auto make_metadata() { 

    return std::tuple<Metadata<Foo1, sizeof...(Ts)>, 
        Metadata<Foo2, sizeof...(Ts)>, 
        Metadata<Foo3, sizeof...(Ts)>>{{0},{0},{0}}; 
} 

那麼最後的代碼是遠遠不好,所以我想有這樣的事情,但自動。也許用tuple_cat和fold表達式,但我有點失落。所以,如果有人知道答案:)

回答

3

您可以使用...意思單一表達式中的多個事物。在這種情況下,要立即擴大Ts都和非立刻道:

template <class... Ts> 
constexpr auto make_metadata() 
{ 
    return std::make_tuple(Metadata<Ts, sizeof...(Ts)>{0}...); 
} 

而且,你不上一行寫的一切,如果它使得它更清晰爲你寫這個方式:

template <class... Ts> 
constexpr auto make_metadata() 
{ 
    constexpr size_t N = sizeof...(Ts); 
    return std::make_tuple(Metadata<Ts, N>{0}...); 
} 
+0

似乎與C + + 17我不必明確地把std :: make_tuple。但是,由於你和Guillaume無論如何:) –

+0

@MathieuVanNevel當然,你可以保存5個字符,只需寫'std :: tuple(...)'。 – Barry

2

std::make_tuple一個簡單的可變參數模板擴展就足夠了:

template <typename... Ts> 
constexpr auto make_metadata() { 
    return std::make_tuple(Metadata<Ts, sizeof...(Ts)>{0}...); 
} 
1

以下應該做你想要什麼:

template <typename T> struct tag {}; 

template <typename ... Ts> 
constexpr auto make_metadata() { 

    return std::tuple<Metadata<Ts, sizeof...(Ts)>...>{{(tag<Ts>{}, 0)}...}; 
} 
相關問題