2017-01-11 4 views
-1

Благодаря SO парней я решил один из моей проблемы: Create a tuple with variatic type wrappedКак пройти же структуру с различным аргументом шаблона в качестве параметра пакета

Но я понял, после того, что я до сих пор есть проблема, которую я не могу решить. Так что теперь у меня есть:

template < typename T, 
      size_t Size > 
struct Metadata { 

    using type = T; 

    std::bitset<Size> bitset; 
}; 

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

Я намерен использовать его «как», что:

constexpr auto result = make_metadata<Foo1, Foo2, Foo3>({0}, {0}, {0}); 

И согласно Jarod42 комментарий, я думаю, что нужно 2 функции.

Но как я могу передать аргументы функции, а затем в кортеж?

И мне интересно, как это, но без силы, чтобы пройти каждый аргументы для каждого Ts, если их нет, я просто поставить значение по умолчанию (2 вопросы).

+0

Pass кортеж для каждого конструктора (который можно распаковать при желании в вспомогательной функции). – Jarod42

+1

Не совсем понятно, что вы хотите, можете ли вы добавить пример того, как его использовать? –

+0

@ Jarod42 на самом деле я просто могу поместить кортеж (как в вашем ответе) в качестве аргумента, а затем при необходимости выполнить значение по умолчанию? –

ответ

1

Это может быть то, что вы хотите, я не уверен. (Так как вы никогда не показывают, где аргументы, которые будут использоваться)


#include <tuple> 
#include <bitset> 
#include <iostream> 

struct A{int value;}; 
struct B{int value;}; 
struct C{int value;}; 

template <typename T,int Size> 
struct Metadata{ 
    using type = T; 
    T value; 
    std::bitset<Size> bitset; 
}; 

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

int main(){ 
    auto data = make_metadata<A,B,C>(1,2,3); 
    std::cout << "(" << std::get<0>(data).value.value 
      << ", " << std::get<1>(data).value.value 
      << ", " << std::get<2>(data).value.value << ")"; 
} 
+0

Спасибо за ваше время, но вы создаете структуру A, B и C. Я не хочу этого, просто метаданные для вашего дела или метаданные . Похоже, мне нужно написать лучший вопрос, потому что все это делали, даже если я не просил об этом. –

+0

@MathieuVanNevel: они являются «метаданными», поэтому мне нужно получить доступ к значению с помощью .value.value' –

+0

, а ваши метаданные не принимают аргумент, вы хотите инициализировать 'битбит'? –

 Смежные вопросы

  • Нет связанных вопросов^_^