объявление функции условного члена на основе длины шаблона - PullRequest
0 голосов
/ 20 октября 2018

Я хочу определить другой набор функций-членов в моем классе в зависимости от длины шаблона класса.Это возможно?Например, возможно ли что-то подобное?

template<class T, std::size_t... T2>
class S {
   public:
      #ifdef SIZE_OF_T2_GREATER_THAN_ZERO
         void f1(params1);
      #else
         void f2(params2);
      #endif
};

Так что, если длина T2... больше нуля, я хочу определить функцию f1, в то время как в * 1006 нет параметров * Я хочу некоторую функциюf2 определено.Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Если вы сделаете функцию-член шаблонной на основе sizeof...(), примененной к T2...

template<std::size_t L = sizeof...(T2)>

Вы можете условно скомпилировать функции, используя std::enable_if, например:

template<class T, std::size_t... T2>
struct my_struct{
    template<std::size_t L = sizeof...(T2)>
    typename std::enable_if<L!=0, void>::type f1()
    {
        std::cout<< "this class has T2...\n";
    }

    template<std::size_t L = sizeof...(T2)>
    typename std::enable_if<L==0, void>::type f2()
    {
        std::cout<< "this class has nooooo T2\n";
    }
};

Я сделал рабочий пример на http://cpp.sh/6jskq

0 голосов
/ 20 октября 2018

Основная идея:

template<std::size_t size_of_t2, class T>
struct Base
{ 
    void f1(params1);
};

template<class T>
struct Base<0, T>
{
    void f2(params2);
};

template<class T, std::size_t... T2>
struct S : Base<sizeof...(T2), T>
{ };

В качестве альтернативы, вы можете иметь f1 и f2, присутствующие в S, а затем защитить их использование с помощью static_assert (обратите внимание, что функции-члены классашаблон не создается, если он не используется):

template<class T, std::size_t... T2>
struct S
{
    void f1(params1)
    { 
        static_assert(sizeof...(T2) > 0);
        ...
    }

    void f2(params2)
    { 
        static_assert(sizeof...(T2) == 0);
        ...
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...