Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Template specialization based on inherit class

I want to make this specialized w/o changing main. Is it possible to specialize something based on its base class? I hope so.

-edit-

I'll have several classes that inherit from SomeTag. I don't want to write the same specialization for each of them.

class SomeTag {};
class InheritSomeTag : public SomeTag {};

template <class T, class Tag=T>
struct MyClass
{
};

template <class T>
struct MyClass<T, SomeTag>
{
    typedef int isSpecialized;
};

int main()
{
    MyClass<SomeTag>::isSpecialized test1; //ok
    MyClass<InheritSomeTag>::isSpecialized test2; //how do i make this specialized w/o changing main()
    return 0;
}

1 Answers

Update for concepts, using C++-20:

#include <concepts>

struct NotSomeTag { };
struct SomeTag { };
struct InheritSomeTag : SomeTag { };

template<typename T>
concept ConceptSomeTag = std::is_base_of_v<SomeTag, T>;

template<class T>
struct MyClass {
};

// Specialization.
template<ConceptSomeTag ST>
struct MyClass<ST> {
    using isSpecialized = int;
};

int main() {
    MyClass<SomeTag>::isSpecialized test1;        /* ok */
    MyClass<InheritSomeTag>::isSpecialized test2; /* ok */
    MyClass<NotSomeTag>::isSpecialized test3;     /* fail */
}

My post from 2014, using C++-11:

#include <type_traits>

struct SomeTag { };
struct InheritSomeTag : SomeTag { };

template<typename T, bool = std::is_base_of<SomeTag, T>::value>
struct MyClass { };

template<typename T>
struct MyClass<T, true> {
    typedef int isSpecialized;
};

int main() {
    MyClass<SomeTag>::isSpecialized test1;        /* ok */
    MyClass<InheritSomeTag>::isSpecialized test2; /* ok */
}
like image 65
Carlo Wood Avatar answered Sep 12 '25 08:09

Carlo Wood