Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于模板类型的不同类型_C++_Templates_Generic Programming - Fatal编程技术网

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
名称