Is it possible to have optional template parameter in C++ , for example
template < class T, class U, class V>
class Test {
};
Here I want user to use this class either with V
or without V
Is following possible
Test<int,int,int> WithAllParameter
Test<int,int> WithOneMissing
If Yes how to do this.
A template argument for a template template parameter is the name of a class template. When the compiler tries to find a template to match the template template argument, it only considers primary class templates. (A primary template is the template that is being specialized.)
8. Why we use :: template-template parameter? Explanation: It is used to adapt a policy into binary ones.
A template parameter is a special kind of parameter that can be used to pass a type as argument: just like regular function parameters can be used to pass values to a function, template parameters allow to pass also types to a function.
A template non-type parameter is a template parameter where the type of the parameter is predefined and is substituted for a constexpr value passed in as an argument. A non-type parameter can be any of the following types: An integral type. An enumeration type. A pointer or reference to a class object.
You can have default template arguments, which are sufficient for your purposes:
template<class T, class U = T, class V = U>
class Test
{ };
Now the following work:
Test<int> a; // Test<int, int, int>
Test<double, float> b; // Test<double, float, float>
Sure, you can have default template parameters:
template <typename T, typename U, typename V = U>
template <typename T, typename U = int, typename V = std::vector<U> >
The standard library does this all the time -- most containers take two to five parameters! For example, unordered_map
is actually:
template<
class Key, // needed, key type
class T, // needed, mapped type
class Hash = std::hash<Key>, // hash functor, defaults to std::hash<Key>
class KeyEqual = std::equal_to<Key>, // comparator, defaults to Key::operator==()
class Allocator = std::allocator<std::pair<const Key, T>> // allocator, defaults to std::allocator
> class unordered_map;
Typicall you just use it as std::unordered_map<std::string, double>
without giving it any further thought.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With