基于模板类型的不同类型

时间:2016-01-14 08:41:01

标签: c++ templates generic-programming

我有::Class1::Class2,我想创建获取第一个或第二个的模板函数,然后根据选定的类使用在不同命名空间中定义的其他类,即{{1} },NameSpace::Class1。有没有办法在C ++中做到这一点?

例如:

NameSpace::Class2

3 个答案:

答案 0 :(得分:3)

NameSpace::T不起作用T不是名称 Class1Class2,它代表的类型。模板不会像那样处理文本替换。

您可以提供一个特征来在全局命名空间中的类型和来自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;
}