2016-06-28 2 views
7

Шаблоны хороши для программирования функций и классов шаблонов, поэтому мы можем использовать, чтобы сократить наш код и позволить компилятору сделать для нас какую-то работу.Шаблоны Variadic и без значений

В моем случае я хочу использовать класс шаблона, например.

template <typename T, typename G> class unicorn { 
T value01; 
G value02; <- not used in ever instance of class unicorn 
}; 

Есть ли способ, что компилятор делает экземпляр с имяТипом T = INT, например, и , если не используется или не указано, версия без TypeName G?

Так что результат выглядит следующим образом:

unicorn <double, int>; 

class unicorn { 
double value01; 
int value02; 
}; 

И без аргумента или указанного TypeName G

unicorn <double> 

class unicorn { 
T value01; 
// "not included in this instance" 
}; 
+0

Отдельный шаблон для одного типа или, возможно, вариационный шаблон и std :: tuple? – KIIV

+0

Кажется, вы пытаетесь переустановить 'std :: tuple' с оговоркой, что вам не нужно больше двух параметров шаблона. –

ответ

5

Если у вас есть конечное число случаев использования и не хотят, чтобы погрузиться в глубокий шаблон метапрограммирования, то вы можете просто сделать типовую специализацию

#include <iostream> 
using namespace std; 

template <typename... Args> 
struct Something; 

template <typename T> 
struct Something<T> { 
    T a; 
}; 

template <typename T, typename U> 
struct Something<T, U> { 
    T a; 
    U b; 
}; 

int main() { 
    __attribute__((unused)) Something<int> a; 
    __attribute__((unused)) Something<int, double> b; 

    return 0; 
} 

Но для В общем случае, думаю, std::tuple может сделать трюк. Взгляните на следующий код

#include <tuple> 
#include <iostream> 
using namespace std; 

template <typename... Args> 
class Something { 
    std::tuple<Args...> tup; 
}; 

int main() { 
    __attribute__((unused)) Something<int> a; 
    __attribute__((unused)) Something<int, double> b; 

    return 0; 
} 

Конечно, вы должны знать о некоторых вещах, как std::ref и get<> функции с кортежем. Вы также можете получить доступ к типам пакетов шаблонов с помощью метапрограммирования нескольких шаблонов. Я не объясняю, что здесь, потому что это может быть действительно длинный ответ в противном случае, если вы все еще хотели бы, чтобы я сделал это, дайте мне знать в комментарии ниже, и я попытаюсь объяснить это вам.

+0

Вы должны попробовать сделать специализации обобщенными. – user2296177

+0

@ user2296177 жаль, что я не думаю, что я следую, что вы имеете в виду? – Curious

+0

Не специализируйтесь на '' и '', а также на '' и ''. Пример: специализация двух типов - 'template struct Something {T a; U b; }; ' – user2296177

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