Просто объявите первичный шаблон с вариационным шаблоном, а затем специализируйтесь на каждом поддерживаемом числе аргументов шаблона. Например:
#ifndef CALL_TEMP_H
#define CALL_TEMP_H
#include <iostream>
template <typename...> class Foo;
template <typename A, typename B>
class Foo<A, B>
{
public:
void output() {
std::cout << a_ << b_ << '\n';
}
A a_;
B b_;
};
template <typename A, typename B, typename C>
class Foo<A, B, C>
{
public:
void output() {
std::cout << a_ << b_ << c_ << '\n';
}
A a_;
B b_;
C c_;
};
#endif
Я не могу использовать C++ 11 и вы хотите сохранить подобную нотацию вам нужно, чтобы имитировать VARIADIC список аргументов с аргументами шаблона по умолчанию. Это косвенно ограничит количество аргументов templare, но поскольку вы все равно специализируетесь на шаблонах, это ограничение не имеет особого значения.
Если это приемлемо использовать различные обозначения можно также использовать то, что выглядит как объявление функции для создания экземпляра и специализации шаблона:
template <typename> class Foo;
template <typename A, typename B>
class Foo<void(A, B)> {
...
};
template <typename A, typename B, typename C>
class Foo<void(A, B, C)> {
...
};
...
Foo<void(int, int)> f2;
Foo<void(int, int, std::string)> f3;
ли изменение в обозначении является приемлемым, зависит от использования шаблон шаблона. Тем не менее, вы не достигнете идеального решения, как с вариативными шаблонами без C++ 11.
BTW, don't overuse std::endl
: использовать '\n'
для обозначения конца строки. Если вы действительно хотите смыть поток, используйте std::flush
. Также _CALL_TEMP_H
- это имя, зарезервированное для стандартной библиотеки C++, как и все имена, начинающиеся с символа подчеркивания, за которым следует символ капитала: не используют эти имена в своем собственном коде, если только у них нет явного разрешения на их использование (например, и __LINE__
являются зарезервировано, но явное разрешение на их использование предоставляется).
+1 Это сделало мой ответ шуткой! – deepmax
+1 но в окнах только визуальная студия 2013 поддерживает аргумент шаблона varadic, поэтому я бы предпочел C++ 98. – Jichao
@Jichao: В окнах у вас есть MinGW/GCC, который идеально подходит. – deepmax