簡體   English   中英

如何以簡單的方式聲明可變參數模板類的類型

[英]How to declare the type of a variadic templated class in a simple way

我在VS2013中有一個可變的模板化結構,該結構使用模板化功能來允許自動類型推斷。

template<typename... T> struct BitVector {
   BitVector(T... args){...}
}
using BitVector_t = struct BitVector<T...>;

template<typename... T>
std::shared_ptr<BitVector_t<T...>>
CreateBitVector(T... args) {
   auto v = new BitVector_t<T...>(args...);
   return std::shared_ptr<BitVector_t<T...>(v);
}

這樣,我可以在一行中定義我的位向量的項和默認值。 此外,我可以通過調用輕松創建BitVector

auto mybitvector = CreateBitVector("Item1", int(1), "Item2", std::string("defval")...);

從函數參數推導類型。 這對於auto很有效 ,但是如果我需要某個BitVector作為類成員,則不允許使用auto ,那么所有努力來獲得一個干凈簡單的API,即只在單個位置指定類型和默認值,消失了,因為一個類成員將需要一個額外的聲明,例如

std::shared_ptr<
BitVector<char const*, int, 
char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char>>>> 
mMyBitVector;

誰能想象一個簡單的解決方法來獲取成員聲明,​​而無需第二次顯式編寫參數類型?

如評論中所建議, decltype可能會有所幫助:

#define AUTO_MEMBER(memberName, init) decltype(init) memberName = (init)

class C
{
public:    
    //...
private:
    AUTO_MEMBER(mMyBitVector, CreateBitVector("Item1", 1, "Item2", std::string("defval")));
};

演示版

但我希望在成員類型上明確(並且可能使用一些typedef )。

使用所有模板參數創建一個類型別名。

using MyBitVector_t = std::shared_ptr<BitVector<char const*, int, std::string>>;

使用類型別名聲明成員。

MyBitVector_t mMyBitVector;

類型別名也可以用於定義函數的返回類型和函數的參數類型。

暫無
暫無

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

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