Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ - Fatal编程技术网

C++ 大括号的数字列表可以用作传递给变量函数(或构造函数)的参数吗?

C++ 大括号的数字列表可以用作传递给变量函数(或构造函数)的参数吗?,c++,C++,大括号的数字列表{0x00,0x01,0x02}可以用作传递给变量函数(或构造函数)的参数吗 在下面的代码中,我可以成功编译并调用: BlobClass blob('A', "xyz", 'B', sss, 'C'); 但以下内容甚至没有编译: BlobClass blob('A', {0x00, 0x01, 0x02}, 'B', sss , 'C'); 有没有一种方法可以让它与以下课程一起使用 class BlobClass { protected: unsigned char

大括号的数字列表{0x00,0x01,0x02}可以用作传递给变量函数(或构造函数)的参数吗

在下面的代码中,我可以成功编译并调用:

BlobClass blob('A', "xyz", 'B', sss, 'C');
但以下内容甚至没有编译:

BlobClass blob('A', {0x00, 0x01, 0x02},  'B', sss , 'C');
有没有一种方法可以让它与以下课程一起使用

class BlobClass
{
protected:
    unsigned char data[512];

    void memcpy_var(unsigned char*) // variadic memcpy terminator
    {
    }

    template <typename... REMAINING>
    void memcpy_var(unsigned char* Dest, const std::string& Peeled, const REMAINING&... RemainingArgs){ // variadic memcpy for std strings
        size_t TheSize = Peeled.size();
        std::memcpy(Dest, Peeled.c_str(), TheSize);
        memcpy_var(Dest + TheSize, RemainingArgs...);
    }

    template <typename... REMAINING>
    void memcpy_var(unsigned char* Dest, const char* Peeled, const REMAINING&... RemainingArgs){    // variadic memcpy for C strings
        while (*Peeled != 0)
            *Dest++ = *Peeled++;

        memcpy_var(Dest, RemainingArgs...);
    }

    template <typename... REMAINING>
    void memcpy_var(unsigned char* Dest, const char& Peeled, const REMAINING&... RemainingArgs){    /// variadic memcpy for single Chars
        *Dest = Peeled;
        memcpy_var(Dest + 1, RemainingArgs...);
    }

public:
    template<typename... ARGS>
    BlobClass(ARGS&&... args) {         //Variadic constructor
        memcpy_var(&data[0], args...);
    }

    BlobClass();
}


int main()
{   
    std::string sss("str");

    BlobClass blob('A', "xyz", 'B', sss, 'C');              //This works fine
    BlobClass blob('A', {0x00, 0x01, 0x02},  'B', sss , 'C');       //This does not compile with the error: "no overloaded function takes 5 arguments"
}
类BlobClass
{
受保护的:
无符号字符数据[512];
void memcpy_var(无符号字符*)//可变memcpy终止符
{
}
样板
void memcpy_var(unsigned char*Dest,const std::string&Peeled,const REMAINING&…RemainingArgs){//std string的可变memcpy
size_t TheSize=Peeled.size();
std::memcpy(Dest,Peeled.c_str(),TheSize);
memcpy_var(目的地+规模,剩余收益…);
}
样板
void memcpy_var(unsigned char*Dest,const char*Peeled,const REMAINING&…RemainingArgs){//C字符串的可变memcpy
而(*剥皮!=0)
*Dest++=*去皮++;
memcpy_var(目的地、剩余收益…);
}
样板
void memcpy_var(unsigned char*Dest,const char&Peeled,const resisting&…RemainingArgs){///单字符的可变memcpy
*Dest=去皮;
memcpy_var(目的地+1,剩余收益…);
}
公众:
样板
BlobClass(ARGS&&…ARGS){//可变构造函数
memcpy_变量(&data[0],args…);
}
BlobClass();
}
int main()
{   
标准::字符串sss(“str”);
BlobClass blob('A','xyz','B',sss,'C');//这很好用
BlobClass blob('A',{0x00,0x01,0x02},'B',sss,'C');//这不会编译,错误为:“没有重载函数接受5个参数”
}
我已尝试添加以下函数,但不起作用:

template <typename... REMAINING>
void memcpy_var(unsigned char* Dest, const std::initializer_list<int>& Peeled, const REMAINING&... RemainingArgs){  // variadic memcpy for an entire initialier list
    size_t TheSize = sizeof Peeled;
    std::memcpy(Dest, &Peeled, TheSize);
    memcpy_var(Dest + TheSize, RemainingArgs...);
}
模板
void memcpy_var(unsigned char*Dest,const std::initializer_list&Peeled,const REMAINING&…RemainingArgs){//variadic memcpy用于整个initializer list
尺寸=剥皮的尺寸;
标准::memcpy(目的地、去皮、尺寸);
memcpy_var(目的地+规模,剩余收益…);
}
附言。
我知道这个类有不安全的代码,因为memcpy_var()可能会溢出数据[512]缓冲区。为了简洁起见,我对边界检查代码进行了清理。

当然可以,但最好的方法是将函数专门化为
std::initializer\u list
,因为我假设您希望对这些代码执行不同的操作

一个可能的实现可以是以下方向

#include <initializer_list>
#include <numeric>

int memcpy_var() {
    return 0;
}

template<typename T, typename ... Ts>
int memcpy_var(T val, Ts ...rest) {
    return val + memcpy_var(rest...);
}

template<typename T, typename ... Ts>
int memcpy_var(std::initializer_list<T> il, Ts ...rest) {
    return std::accumulate(il.begin(), il.end(), 0) + memcpy_var(rest...);
}

int main() {
    return memcpy_var({1, 2, 3}, 5);
}
#包括
#包括
int memcpy_var(){
返回0;
}
样板
int memcpy_var(T val,Ts…rest){
返回val+memcpy_var(rest…);
}
样板
int memcpy_var(std::initializer_list il,Ts…rest){
返回std::accumulate(il.begin(),il.end(),0)+memcpy_var(rest…);
}
int main(){
返回memcpy_var({1,2,3},5);
}

在操作中:

大括号列表没有type@NathanOliver这种类型的缺失有解决办法吗?e、 一些默认的或隐式的类型赋值/转换/转换?不太可能,但是你可以通过另一个函数来传递每个参数,如果它是一个初始值设定项列表,你可以通过另一个函数来为你创建对象,否则就转发参数。使用可变模板和完美转发。@N00by我不知道完美转发和可变模板(只知道可变函数)。你知道有什么材料可以解释怎么做吗?好的,我会把它作为一个完整的答案贴出来。只有当初始值设定项列表是第一个参数时,这才有帮助。从OP的外观来看,它还希望支持像
memcpy_var(5,{1,2,3})
这样的东西,我不认为有一种通用的方法可以在任何位置使用任何数量的参数和列表。啊,是的,它只作为第一个参数工作。虽然这是次优的,但一般来说,在调用时,您应该总是能够将初始值设定项列表作为第一个参数。这是语言中的一个缺陷,还是我们没有看到更好的解决方案?那么,为什么编译器在试图调用:
memcpy_var('S',{1,2,3})