基于模板类型的不同类型
Different type based on template type
我有 ::Class1
和 ::Class2
,我想创建模板函数,获取第一个或第二个,然后根据所选 class 使用其他 classes 在不同的命名空间中定义,即 NameSpace::Class1
、NameSpace::Class2
。有没有办法用 C++ 实现?
例如:
namespace NameSpace
{
class Class1 {}; class Class2 {};
}
template <class T> // example Class1 or Class2
void f(T object) {
NameSpace::T obj; // Something like this, but it doesn't work
}
NameSpace::T
不起作用,因为 T
不是 name 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;
}
您可以专门化结构以将一种类型映射到另一种类型
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 以外的类型,这也会产生编译错误。
只需省略 NameSpace::T
中的 NameSpace
。命名空间必须在函数 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;
}
我有 ::Class1
和 ::Class2
,我想创建模板函数,获取第一个或第二个,然后根据所选 class 使用其他 classes 在不同的命名空间中定义,即 NameSpace::Class1
、NameSpace::Class2
。有没有办法用 C++ 实现?
例如:
namespace NameSpace
{
class Class1 {}; class Class2 {};
}
template <class T> // example Class1 or Class2
void f(T object) {
NameSpace::T obj; // Something like this, but it doesn't work
}
NameSpace::T
不起作用,因为 T
不是 name 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;
}
您可以专门化结构以将一种类型映射到另一种类型
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 以外的类型,这也会产生编译错误。
只需省略 NameSpace::T
中的 NameSpace
。命名空间必须在函数 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;
}