[英]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.