簡體   English   中英

根據模板類型不同

[英]Different type based on template type

我有::Class1::Class2 ,我想創建第一個或第二個得到的模板函數,然后根據選定的類使用在不同名稱空間中定義的其他類,即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不是名稱 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM