gpt4 book ai didi

c++ - 可以将花括号数字列表用作传递给可变参数函数(或构造函数)的参数吗?

转载 作者:行者123 更新时间:2023-11-28 04:43:34 24 4
gpt4 key购买 nike

可以将数字 {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"
}

我尝试添加以下功能,但它不起作用:

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

附言我知道这个类有不安全的代码,因为 memcpy_var() 可以溢出 data[512] 缓冲区。为了简洁起见,我清理了边界检查代码。

最佳答案

当然可以,但最好的方法是将函数专门用于 std::initializer_list<T> ,因为我假设您想为这些做一些不同的事情。

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

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

在行动中:https://godbolt.org/g/Dx3nsm

关于c++ - 可以将花括号数字列表用作传递给可变参数函数(或构造函数)的参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49718814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com