如何以简单的方式声明可变参数模板类的类型

时间:2015-11-18 16:30:06

标签: c++ c++11 visual-c++

我在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的项和默认值。此外,我可以通过调用

轻松创建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;

有人可以想象一个简单的解决方法,获取成员声明,​​而不是第二次明确写入参数类型吗?

2 个答案:

答案 0 :(得分:2)

根据评论中的建议,decltype可能有所帮助:

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

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

Demo

但我更希望明确成员类型(可能正在使用一些typedef)。

答案 1 :(得分:1)

使用所有模板参数创建一个类型别名。

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

使用类型别名来声明成员。

MyBitVector_t mMyBitVector;

类型别名也可用于定义函数的返回类型和函数的参数类型。