Специализация шаблона класса для всех классов в пространстве имен

0

Есть ли способ специализировать шаблон класса с использованием одного параметра для классов во второй библиотеке. Дана первая библиотека (Poco), но классы во второй библиотеке могут быть изменены.

#include <iostream>

namespace FirstLibrary {
    template <typename T>
    struct TypeHandler
    {
        static void apply() {
            std::cout << "First Library" << std::endl;
        }
    };
}

namespace  SecondLibrary {
    template <typename T>
    struct TypeHandler {
        static void apply() {
            std::cout << "Second Library" << std::endl;
        }
    };

    struct Type {};
}


namespace FirstLibrary {
    // This is invalid code:
    // template <typename T>
    // struct TypeHandler<T> : SecondLibrary::TypeHandler<T>
    // {};

    // This is valid and suggested code I like to avoid typing over and over again:
    template<>
    struct TypeHandler<SecondLibrary::Type> : SecondLibrary::TypeHandler<SecondLibrary::Type>
    {};
}


int main() {
    FirstLibrary::TypeHandler<SecondLibrary::Type>::apply();
    return 0;
}
Теги:
c++11

1 ответ

1

Если вы хотите сохранить некоторые печатать, вы можете использовать, using в качестве:

namespace FirstLibrary {
    // use the one you prefer:
    using SecondLibrary::Type;
    //using namespace SecondLibrary;


    template<>
    struct TypeHandler<Type> : SecondLibrary::TypeHandler<Type>
    {};
}

SecondLibrary::TypeHandler необходимо указать, иначе TypeHandler будет ссылаться на FirstLibrary::TypeHandler.

Аналогичный подход заключается в использовании псевдонима пространства имен:

namespace FirstLibrary {
    namespace SL = SecondLibrary;

    template<>
    struct TypeHandler<SL::Type> : SL::TypeHandler<SL::Type>
    {};
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню