C++ 如何以简单的方式声明可变模板类的类型
我在VS2013中有一个可变模板结构,它使用一个模板函数来允许自动类型推断C++ 如何以简单的方式声明可变模板类的类型,c++,c++11,visual-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...>> Crea
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);
}
其中,类型由函数参数推导而来。
这在自动模式下非常有效,
但是,如果我需要一个特定的位向量作为类成员,其中不允许自动,那么所有为创建一个干净简单的API所做的努力似乎都消失了,因为类成员需要一个额外的声明,比如
std::shared_ptr<
BitVector<char const*, int,
char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char>>>>
mMyBitVector;
std::共享<
位向量>
mMyBitVector;
任何人都可以想象一个简单的解决方法,在不第二次显式写入参数类型的情况下获取成员声明吗?创建一个包含所有模板参数的类型别名
using MyBitVector_t = std::shared_ptr<BitVector<char const*, int, std::string>>;
类型别名也可用于定义函数的返回类型和函数的参数类型。使用所有模板参数创建类型别名
using MyBitVector_t = std::shared_ptr<BitVector<char const*, int, std::string>>;
类型别名也可用于定义函数的返回类型和函数的参数类型。如注释所示,
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
)。如评论所示,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
)。“…没有第二次显式写入参数类型?”可能是typedef?@πάνταῥεῖ .@luk32应该同样有效。您还可以执行“邪恶”宏:#define member\u creator(a,b)decltype(b)a=b
(或类似操作)。用法:member_creator(mybitvector,CreateBitVector(“Item1”,int(1),“Item2”,std::string(“deffal”)…)
将创建一个名为mybitvector
的成员,其类型与CreateBitVector
返回的类型相同。可能不是最漂亮的解决方案。@Banan从某种意义上说,定义/声明是自包含的(即,所有的定义/声明都在一个位置)“…没有第二次显式写入参数类型?”可能是typedef?@πάνταῥεῖ .@luk32应该同样有效。您还可以执行“邪恶”宏:#define member\u creator(a,b)decltype(b)a=b
(或类似操作)。用法:member_creator(mybitvector,CreateBitVector(“Item1”,int(1),“Item2”,std::string(“deffal”)…)
将创建一个名为mybitvector
的成员,其类型与CreateBitVector
返回的类型相同。也许不是最漂亮的解决方案。@Banan从某种意义上讲,定义/声明是自包含的(即,所有内容都在一个位置上),这是非常漂亮的