How can I enforce Static Functions in a class template and reference them

Viewed 44

This is kind of a two-part question, but I believe they're very closely related.

Question 1:

I've read on other questions that there are ways to enforce a class in having certain static functions, like such:

class Type{
   virtual void staticVirtual() = 0;
};

template<typename T>
class StaticContract{
   void staticVirtual(){
       T::foo();
   }
};

If I made a class that inherited from this contract:

class Example : public StaticContract<Example>{
   ...
};

Then Example would have to implement a static function foo().

The problem I'm having is if I make a templated class that inherits from the contract:

template <Typename T>
class mTemplateClass : 
   public StaticContract<mTemplateClass<T>>{
   ...
}

I don't get any errors for not implementing foo().

How can I enforce a template to have certain static functions that I can call, or is that even possible?


Question 2:

Considering the above question, each StaticContract contains a static instance of a Registration that is instantiated with the type passed, (StaticContract<typename T> and will have a Registration<T>):

template <typename T>
class Registration :
    public Registrants
{
public:
    Registration() {
        vectorOfFunctions->push_back(&T::foo);
    }
};

When the class inheriting from StaticContract is not a template, this works fine, but when its a template, it'll never push back an instance of its function, not to mention it doesn't even enforce its implementation.

How can I push back this function from the most derived class?

0 Answers
Related