我有::Class1
和::Class2
,我想创建获取第一个或第二个的模板函数,然后根据选定的类使用在不同命名空间中定义的其他类,即{{1} },NameSpace::Class1
。有没有办法在C ++中做到这一点?
例如:
NameSpace::Class2
答案 0 :(得分:3)
NameSpace::T
不起作用T
不是名称 Class1
或Class2
,它代表的类型。模板不会像那样处理文本替换。
您可以提供一个特征来在全局命名空间中的类型和来自NameSpace
的类型之间进行转换:
struct Class1{}; struct Class2 {};
namespace NameSpace
{
class Class1 {}; class Class2 {};
template <typename T> struct translate;
template<> struct translate<::Class1> {
using type = Class1;
};
template<> struct translate<::Class2> {
using type = Class2;
};
template <typename T>
using translate_t = typename translate<T>::type;
}
你会像这样使用它:
template <class T>
void f(T object) {
using Translated = NameSpace::translate_t<T>;
Translated obj;
}
答案 1 :(得分:1)
您可以专门化结构以将一种类型映射到另一种类型
template <typename T>
struct FromType {};
template <>
struct FromType<Class1>
{
typedef ns::Class1 type;
}
template <>
struct FromType<Class2>
{
typedef ns::Class2 type;
}
然后可以通过将结果类型引用为
,将其用于模板函数typename FromType<T>::type
请注意,如果您尝试使用Class1或Class2以外的类型,这也会产生编译错误。
答案 2 :(得分:0)
只需点击NameSpace
中的NameSpace::T
即可。必须在函数f
调用中定义名称空间。以下示例编译。
namespace NameSpace
{
class Class1 {}; class Class2 {};
}
template <class T> // example Class1 or Class2
void f(T object) {
T obj;
}
int main()
{
NameSpace::Class1 x;
f(x);
return 0;
}