Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以简单的方式声明可变模板类的类型_C++_C++11_Visual C++ - Fatal编程技术网

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

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

我在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);
}
其中,类型由函数参数推导而来。 这在自动模式下非常有效, 但是,如果我需要一个特定的位向量作为类成员,其中不允许自动,那么所有为创建一个干净简单的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从某种意义上讲,定义/声明是自包含的(即,所有内容都在一个位置上),这是非常漂亮的