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

标签 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);
}

有了这个,我可以在一行中定义我的位 vector 的项目和默认值。此外,我可以通过调用轻松创建 BitVector

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

其中类型是从函数参数推导出来的。 这适用于auto, 但是如果我需要一个特定的 BitVector 作为类成员,其中不允许 auto,所有努力都有一个干净简单的 API,其中类型和默认值只是在 单个 位置,似乎已经消失,因为类(class)成员需要额外的声明,例如

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")));
};

Demo

但我更愿意明确成员类型(并且可能使用一些 typedef)。

关于c++ - 如何以简单的方式声明可变参数模板类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33785348/

相关文章:

c++ - 自定义Allocator编译难点2

c++ - 使用 extern c 和 dllexport 与模块定义 (msvc++) 进行标准调用名称修改

c++ - 一旦失去焦点如何更新屏幕

windows - 如何判断打印机是否支持双向通信

c++ - 使用 hash_map 时,在 STL 字符串上使用的最佳散列算法是什么?

c++ - 在 C++ 中确定等待同一阻塞操作的线程优先级的好方法是什么?

c++ - 在 Qt 中处理非常大的图像

c++ - move 构造函数可以是隐式的吗?

c++ - 具有单个互斥体的 std::scoped_lock 行为

c++ - 基于指针的基本随机访问迭代器的代码?