Я снова застрял...
У меня есть этот класс шаблона:
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*
и преобразование указателя, которую вы можете найти в стирании типа boost