2017-06-28 40 views
0

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

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

“for all instances” - 对于所有实例的所有实例?模板专门用于类型,而不是实例。 –

+0

是的。经过一天的编程,这种错误可能会发生。 – PaulProgrammerNoob

+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.