NickFP
NickFP

Reputation: 369

Can a template class alias itself without specifying its template parameters twice?

I'm trying to define a new class template which has many parameters. For writing some methods (such as overloaded operators), I'd like to alias the template class type. Right now I'm doing it like this:

template <class T, int a, int b, int c, int d, int e, int f>
class ExampleClass {

  using ExampleClassType = ExampleClass<T, a, b, c, d, e, f>;

  // for example,
  ExampleClassType operator+(const ExampleClassType& rhs) {
    // ...
  }

};

This approach seems redundant, since I'm writing out the list of template parameters twice. Is there a better way? I naively tried

using ExampleClassType = decltype(*this);

but this doesn't work, I think since this is not known at compile time.

Apologies if this is a duplicate question, I tried searching but found nothing about this specifically.

Upvotes: 4

Views: 130

Answers (1)

Nathan Pierson
Nathan Pierson

Reputation: 5565

You can actually just use ExampleClass for this purpose. It's called the injected class name and inside the class definition you can use it and it will implicitly be the fully instantiated class.

Example:

#include <iostream>

template<class T, int a>
struct ExampleClass
{
    ExampleClass operator+(const ExampleClass& t_rhs) const { std::cout << a << '\n'; return *this; }
};


int main(int argc, char** argv){
    ExampleClass<int, 7> myClass;
    auto foo = myClass + myClass;
}

See on godbolt.

This will output 7 because in my operator+, ExampleClass was actually used as an injected class name and meant ExampleClass<int, 7>.

Upvotes: 3

Related Questions