Для каждого типа шаблона аргумент типа набора
Скажем, у меня есть шаблон класса Variadic. Как создать функцию так, чтобы ее аргументы были заданного типа, например int
с количеством аргументов, равным количеству типов шаблонов?
template <typename... Types>
class Test
{
public:
void Func(???); // I don't know how to declare such a function
}
Test<string, bool, long> myTest; // Three types
myTest.Func(905, 36, 123315); // Three arguments, but always of type int.
В конце цель функции состоит в том, чтобы возвратить кортеж предоставленных целых. Для простоты я показал, что в коде примера функция не используется.
2 ответа
template <typename... Types>
class Test
{
template <typename>
using int_t = int;
public:
void Func(int_t<Types>... ints)
{
}
};
пример wandbox - (работает с C++11)
Если вам не требуется SFINAE, вы можете использовать static_assert
чтобы убедиться, что ваши условия выполнены:
template <typename... Types>
class Test
{
public:
template <typename... Ts>
void Func(Ts...)
{
static_assert(sizeof...(Ts) == sizeof...(Types), "");
static_assert(std::conjunction<std::is_same<Ts, int>...>{}, "");
}
};
(Если вам нужен SFINAE, используйте std::enable_if
.)
std::conjunction
проверяет, что все условия, выполненные для него, выполняются.
В приведенном выше примере следующие вызовы действительны / недействительны:
myTest.Func(905, 36, 123315); // valid
myTest.Func(905, 36, 123315.f); // invalid
myTest.Func(905, 22); // invalid
Как вы можете видеть, неявные преобразования не разрешены с этим решением. Вы могли бы использовать std::is_convertible
вместо std::is_same
если вы хотите, чтобы они были разрешены.