模板定义中的命名空间约束
Namespace constraint in template definition
我必须为给定命名空间 rofl
中的所有类型专门化一个模板函数。模板类型的命名空间约束是否可能?我有以下想法:
template<typename rofl::T>
MyClass::MyFunc() {
impl = T::create();
}
如果将函数模板放入要专门化的命名空间中,则可以使用参数相关查找。
struct Out{};
namespace ns
{
struct In{};
template <typename T>
void ADL(const T&){} //Found via argument dependent lookup
}
template <class T, class U = decltype(ADL(std::declval<T>()))>
void func_impl(int) //Better match, only works if function ADL is found
{
std::cout << "Specialized.\n";
}
template <class T>
void func_impl(...)
{
std::cout << "Unspecialized.\n";
}
template <class T>
void func()
{
func_impl<T>(0);
}
当您调用 func
时,它将调用 func_impl
的正确重载。
func<Out>(); //prints Unspecialized.
func<ns::In>(); //prints Specialized.
我必须为给定命名空间 rofl
中的所有类型专门化一个模板函数。模板类型的命名空间约束是否可能?我有以下想法:
template<typename rofl::T>
MyClass::MyFunc() {
impl = T::create();
}
如果将函数模板放入要专门化的命名空间中,则可以使用参数相关查找。
struct Out{};
namespace ns
{
struct In{};
template <typename T>
void ADL(const T&){} //Found via argument dependent lookup
}
template <class T, class U = decltype(ADL(std::declval<T>()))>
void func_impl(int) //Better match, only works if function ADL is found
{
std::cout << "Specialized.\n";
}
template <class T>
void func_impl(...)
{
std::cout << "Unspecialized.\n";
}
template <class T>
void func()
{
func_impl<T>(0);
}
当您调用 func
时,它将调用 func_impl
的正确重载。
func<Out>(); //prints Unspecialized.
func<ns::In>(); //prints Specialized.