簡體   English   中英

如何獲取模板 class 的命名空間?

[英]How to get the namespace of a template class?

我想寫一個模板 class 像:

template<class A>
class B{/*class B code*/};

有 class A 位於各種命名空間中,例如:

namespace ns1{
class X{/*class X code*/};
class A{/*class A code*/};
}
namespace ns2{
class X{/*class X code*/};
class A{/*class A code*/};
}

現在如何在與 B 內某處的 A 相同的命名空間中訪問 class X?

現在如何在與 B 內某處的 A 相同的命名空間中訪問 class X?

你沒有。 沒有辦法獲取一個類型,提取它的名稱空間,並通過組合該名稱空間和名稱來構建一個新的類型名稱。

如果您需要B模板能夠訪問與模板參數給定的類型相關聯的某些 class,那么該關聯應該是顯式的,以某種方式是該類型接口的一部分,而不是基於任意命名公約。

指定此類事物的兩種傳統機制是成員類型別名或特征 class:

//Member alias
template<class A>
class B{
  /* typename A::X is required to be an alias for the class associated with `A`.
};

namespace ns1{
class U{/*class U code*/};
class A{ using X = U;};
}

//traits
//Default implementation
template<class A>
class A_traits
{
  using X = typename A::X; //By default, assume that `A` provides a member typedef.
};

template<class A>
class B{
  /* typename A_traits<A>::X is required to be an alias for the class associated with `A`.
};

namespace ns1{
class U{/*class U code*/};
class A{}; //Doesn't provide the default.
}

//Specialization for `ns1::A`. Must be declared in the same namespace as the primary `A_traits` namespace
template<>
class A_traits<ns1::A>
{
  using X == ns1::U;
};

特征機制更復雜,但它適用於您無法控制的類型以及int和指針等基本類型。

暫無
暫無

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

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