Для каждого типа шаблона аргумент типа набора

Скажем, у меня есть шаблон класса 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)
    {
    }
};

DEMO

пример 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 если вы хотите, чтобы они были разрешены.

Другие вопросы по тегам