C++ 基于模板类型的不同类型
我有C++ 基于模板类型的不同类型,c++,templates,generic-programming,C++,Templates,Generic Programming,我有::Class1和::Class2,我想创建一个模板函数,获取第一个或第二个模板函数,然后根据所选类使用在不同名称空间中定义的其他类,即名称空间::Class1,名称空间::Class2。在C++中有没有办法?< /P> 例如: namespace NameSpace { class Class1 {}; class Class2 {}; } template <class T> // example Class1 or Class2 void f(T obj
::Class1
和::Class2
,我想创建一个模板函数,获取第一个或第二个模板函数,然后根据所选类使用在不同名称空间中定义的其他类,即名称空间::Class1
,名称空间::Class2
。在C++中有没有办法?< /P>
例如:
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
}
名称空间
{
类1{};类2{};
}
模板//示例Class1或Class2
void f(T对象){
NameSpace::T obj;//类似这样的内容,但它不起作用
}
名称空间::T
不起作用,因为T
不是名称Class1
或Class2
,它代表类型。模板不适用于这样的文本替换
您可以提供一个特性,以便在全局命名空间中的类型和命名空间中的类型之间进行转换:
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;
}
struct Class1{};结构类2{};
名称空间
{
类1{};类2{};
模板结构翻译;
模板结构转换{
使用类型=类别1;
};
模板结构转换{
使用类型=类别2;
};
模板
使用translate\u t=typename translate::type;
}
您可以这样使用:
template <class T>
void f(T object) {
using Translated = NameSpace::translate_t<T>;
Translated obj;
}
模板
void f(T对象){
使用Translated=NameSpace::translate\t;
翻译obj;
}
名称空间::T
不起作用,因为T
不是名称Class1
或Class2
,它代表类型。模板不适用于这样的文本替换
您可以提供一个特性,以便在全局命名空间中的类型和命名空间中的类型之间进行转换:
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;
}
struct Class1{};结构类2{};
名称空间
{
类1{};类2{};
模板结构翻译;
模板结构转换{
使用类型=类别1;
};
模板结构转换{
使用类型=类别2;
};
模板
使用translate\u t=typename translate::type;
}
您可以这样使用:
template <class T>
void f(T object) {
using Translated = NameSpace::translate_t<T>;
Translated obj;
}
模板
void f(T对象){
使用Translated=NameSpace::translate\t;
翻译obj;
}
您可以专门化结构以将一种类型映射到另一种类型
template <typename T>
struct FromType {};
template <>
struct FromType<Class1>
{
typedef ns::Class1 type;
}
template <>
struct FromType<Class2>
{
typedef ns::Class2 type;
}
模板
struct FromType{};
模板
struct FromType
{
typedef ns::Class1类型;
}
模板
struct FromType
{
typedef ns::Class2类型;
}
然后,通过将生成的类型引用为
typename FromType<T>::type
typename FromType::type
请注意,如果尝试使用除Class1或Class2以外的类型,这也会导致编译错误。您可以专门化结构以将一种类型映射到另一种类型
template <typename T>
struct FromType {};
template <>
struct FromType<Class1>
{
typedef ns::Class1 type;
}
template <>
struct FromType<Class2>
{
typedef ns::Class2 type;
}
模板
struct FromType{};
模板
struct FromType
{
typedef ns::Class1类型;
}
模板
struct FromType
{
typedef ns::Class2类型;
}
然后,通过将生成的类型引用为
typename FromType<T>::type
typename FromType::type
请注意,如果尝试使用除Class1或Class2以外的类型,这也会导致编译错误。只需在名称空间::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;
}
名称空间
{
类1{};类2{};
}
模板//示例Class1或Class2
void f(T对象){
T-obj;
}
int main()
{
名称空间::class1x;
f(x);
返回0;
}
只需在名称空间::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;
}
名称空间
{
类1{};类2{};
}
模板//示例Class1或Class2
void f(T对象){
T-obj;
}
int main()
{
名称空间::class1x;
f(x);
返回0;
}
您可以发布一些示例代码吗?我不知道你打算如何使用这个。名称空间名称空间{Class1{};Class2{};}模板//示例Class1或Class2 void f(T object){namespace::T obj;//类似的东西,但它不起作用}但是我可以用一种通用的方式进行实例化,而不检查类型(如果有的话)。很多类的情况如何?试着评估代码结构,找到一种不同的方法来完成模板正在做的事情。C++模板意味着忽略类型信息,并允许模板的用户为他们想要的任何类型替换类型T,只要模板中使用的符号来自T类型,它就应该作为您的意图工作。也就是说,不要担心A类或B类,担心模板的实现,使用模板时只担心A类或B类。你能发布一些示例代码吗?我不知道你打算如何使用这个。名称空间名称空间{Class1{};Class2{};}模板//示例Class1或Class2 void f(T object){namespace::T obj;//类似的东西,但它不起作用}但是我可以用一种通用的方式进行实例化,而不检查类型(如果有的话)。很多类的情况如何?试着评估代码结构,找到一种不同的方法来完成模板正在做的事情。C++模板意味着忽略类型信息,并允许模板的用户为他们想要的任何类型替换类型T,只要模板中使用的符号来自T类型,它就应该作为您的意图工作。也就是说,不要担心类A或类B,担心模板的实现,使用模板时只担心A或B。为什么要在专用类型上使用范围解析运算符?@StoryTeller,因为我将该特性放在名称空间中
以避免污染全局名称空间,所以Class1
名称名称空间::Class1
和::Class1
名称