Я снова застрял …
У меня есть этот шаблон класса:
template <typename a,typename b,typename c>
class myclass
{...};
Я хотел бы объявить объект этого класса:
myclass<a,b,c> x;
Это, очевидно, не работает, и я, кажется, не могу понять, как объявить этот объект или, если это вообще возможно.
Я могу сделать объект как это:
myclass<int,double,int> x;
Но я не хочу указывать типы a, b, c.
Вам нужно объявить это в шаблонной функции или классе, если я вас правильно понимаю.
template <typename a,typename b,typename c>
void F(){
myclass<a,b,c> x;
...
}
В противном случае это запрещено C ++ и логикой.
Типичный способ создания сложных шаблонных экземпляров без указания аргументов — это вывод типа функция шаблон:
template <typename A, typename B, typename C>
myclass<A, B, C> make_myclass(A a, B b, C C)
{
return myclass<A, B, C>(); // or whatever
}
Использование:
auto x = make_myclass(1, 'x', -2.5f); // x is a myclass<int, char, float>
Типичные примеры из стандартной библиотеки, которые используют эту идиому: make_shared
, make_unique
, make_pair
, make_tuple
, make_exception_ptr
а также make_optional
,
в c ++ нет зависимого от типа объекта, каждый объект должен быть напечатан при объявлении. Единственный способ добиться стирания типа — использовать такую технику, как void*
и преобразование указателя, которое вы можете найти из стирание типа буста