簡體   English   中英

根據模板參數選擇成員類型?

[英]Choose member type based on template arguments?

如果我有模板類:

template<int N>
class C{
    Something _x;
}

我想根據N的值來控制類成員_x的類型。 假設N為0,則_x應為A類型,否則_x應為B類型。

這可能嗎?

我不想只是將類型作為模板參數傳遞,因為可能會違反確定使用哪種類型的規則。 例如我可以做C<1, A>這是不正確的。

對於只有少數幾種可能類型的方案,可以使用std::conditional

#include <type_traits>

struct A {};
struct B {};

template<int N>
class M {
public:
    std::conditional_t<N == 0, A, B> _x;
};

這可能嗎?

是。 也不太困難。

template<int N>
class C{
    typename c_member<N>::type _x;
}

哪里

struct A {};
struct B {};

template <int N> struct c_member
{
   using type = B;
};

template <> struct c_member<0>
{
   using type = A;
};

如果需要,可以添加c_member更多專業化。

有很多方法可以做到這一點。 我喜歡重載,asmit允許輕松擴展。

template<int N>using int_t=std::integral_constant<int,N>;
template<class T>struct tag_t{using type=T; constexpr tag_t(){}};
template<class Tag>using type=typename Tag::type;

struct A{}; struct B{};
inline tag_t<A> something(int_t<0>){return {};}
template<int x>
inline tag_t<B> something(int_t<x>){return {};}

現在我們只是:

template<int N>
class M {
public:
  type<decltype(something(int_t<N>{}))> _x;
};

唯一的優點是您擁有了重載解析的全部功能來選擇類型,並且您不必弄亂模板的專業化,也不必使一個復雜的條件涵蓋很多情況。

如果您使用簡單的邏輯在兩種類型之間進行選擇,那就太過分了。

暫無
暫無

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

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