Есть ли способ специализировать шаблон класса с использованием одного параметра для классов во второй библиотеке. Дана первая библиотека (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;
}
Если вы хотите сохранить некоторые печатать, вы можете использовать, 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>
{};
}