基于模板类型的不同类型

Different type based on template type

我有 ::Class1::Class2,我想创建模板函数,获取第一个或第二个,然后根据所选 class 使用其他 classes 在不同的命名空间中定义,即 NameSpace::Class1NameSpace::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 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;
}

您可以专门化结构以将一种类型映射到另一种类型

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;
}