I often find the need to use the following pattern:
template<typename T>
class SomeClass : public Base {
SomeClass(const T& t) {...}
...
};
template<typename T>
SomeClass<T>* makeSomeClass(const T& t) {
return new SomeClass<T>(t);
}
And to use it:
Base* = makeSomeClass(123);
This is useful when I don’t want to explicitly specify T because it is a very complex (function types, etc’) and the function argument can deduce the type implicitly.
Is there a way to do this without the extra “make” function? Why does template deduction work only in function arguments and not in constructor arguments?
No, there is no way to do this without an extra make function.
The reason it doesn’t work with constructors is because it would be ridiculously complicated. Consider this:
What if I then call:
Does that give me a
Foo< Foo<int> >or am I calling the copy constructor for aFoo<int>?It would be ambiguous in too many places, so the extra function is necessary.
Note that you can automate the create of make functions a little by using template templates:
Then you can use: