模板定义中的命名空间约束

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.