Mu Qiao
Mu Qiao

Reputation: 7107

specialize a template class for a template function

I have two template classes like

template <class T>
class MyClass1{};

template <class T>
class MyClass2{};

and I have a template function using them as an argument. The classes are specialized with std::string:

template <template class<std::string> T> myMethod(T<std::string>& arg){}

I'd like to use myMethod(objectOfMyClass1) and myMethod(objectOfMyClass2), but the code doesn't compile. How to specialize a template class for a template function?

Upvotes: 0

Views: 122

Answers (2)

Andriy
Andriy

Reputation: 8604

This is a compilable example

template <class T>
class MyClass1{};

template <class T>
class MyClass2{};

template <template <typename> class T> 
void myMethod(T<std::string>& arg){}

int main()
{
MyClass1<std::string> c1;
myMethod(c1);
MyClass1<std::string> c2;
myMethod(c2);
}

Upvotes: 1

Grzegorz Herman
Grzegorz Herman

Reputation: 1915

First, if your method does not take any arguments, you won't be able to call it as you want.

Second, MyClass1 and MyClass2 are not classes but class templates -- you cannot therefore have objectOfMyClass1 and objectOfMyClass2.

If you your function to behave specially for an argument of any type of the form SomeClassTemplate<std::string>, then what you're after is partial function template specialization, which is not allowed in C++. You will have to use a partially-specialized class instead:

template <class T>
struct MyMethodCall;

template <template <typename> class T>
struct MyMethodCall<T<std::string> > {
  static void call(T<std::string> object) {
    ...
  }
};

template <class T>
void myMethod(T & object) {
  MyMethodCall<T>::call(object);
}

Upvotes: 2

Related Questions