[英]Different type based on template type
我有::Class1
和::Class2
,我想創建第一個或第二個得到的模板函數,然后根據選定的類使用在不同名稱空間中定義的其他類,即NameSpace::Class1
, NameSpace::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
不是名稱 Class1
或Class2
,它表示類型。 模板不適用於這樣的文本替換。
您可以提供一個特征,以在全局名稱空間的類型和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.