#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 из класса в анонимное пространство имен и использования его для наследования?