Переменные шаблоны — есть ли способ избежать повторения

#c #variadic-templates

#c #переменные шаблоны

Вопрос:

В коде (просто вставьте и скопируйте) есть ли способ избежать повторения / перечисления аргументов шаблона (строка, отмеченная в коде):

 #include <iostream>

using namespace std;


template<class T,class... V>
struct nullptr_
{
    nullptr_(Tamp; obj,Vamp;... args)
    {
        nullptr_hlp(obj,args...);
    }

    template<class A>
    static void nullptr_hlp(Aamp; a);
    {
        a = nullptr;
    }

    template<class A,class... Vs>
    static void nullptr_hlp(Aamp; a,Vsamp;... args)
    {
        a = nullptr;
        nullptr_hlp(args...);
    }

};


class X : nullptr_<int*,double*,char*>//IS THERE A WAY TO HAVE JUST nullptr_?
{

    int* a;
    double* b;
    char* c;
    typedef nullptr_<decltype(a),decltype(b),decltype(c)> init_;
public:
    X():init_(a,b,c)
    {

    }

};
int main()
{
   X x;
    return 0;
}
  

Комментарии:

1. Как насчет простого использования std::tuple<int*, double*, char*> ?

2. Или еще лучше, используя a(),b(),c() в вашем списке инициализации.

3. @KerrekSB это не сработает.

4. @CoryNelson это вариант, но метод by более явно отражает намерения программиста, хотя и должен быть предпочтительным.

Ответ №1:

nullptr_<int*,double*,char*> становится введенным именем класса внутри X , поэтому вы можете ссылаться на него без списка аргументов:

 class X : nullptr_<int*,double*,char*>//can't do away with the list here, unless you want to typedef it
{

    int* a;
    double* b;
    char* c;
    //typedef nullptr_<decltype(a),decltype(b),decltype(c)> init_; //don't really need this
public:
    X():nullptr_(a,b,c) //can be used without the argument list
    {

    }
};
  

Ответ №2:

Как насчет переноса typedef из класса в анонимное пространство имен и использования его для наследования?