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

时间:2017-06-28 17:21:17

标签: c++ templates namespaces template-specialization

我必须为给定命名空间rofl中的所有类型专门化模板函数。是否可以使用模板类型的命名空间约束?我有以下几点:

template<typename rofl::T>
MyClass::MyFunc() {
    impl = T::create();
}

1 个答案:

答案 0 :(得分:2)

如果将函数模板放在要专门设置的命名空间中,则可以使用参数依赖查找。

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.