gpt4 book ai didi

c++ - 使用 C++11 将可变函数参数转发给可变函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:59 25 4
gpt4 key购买 nike

我想将调用转发到具有可变参数方法的库。我能想出的最简单的例子来重现这个问题:

void Bar(int useless, ...)
{
//Does something
}

template<typename... Args>
void Foo(int useless, Args... args)
{
Bar(useless, args...);
}

如您所见,我试过了。但是,即使编译成功,它似乎也会导致堆栈出现摇摆不定,我在应用程序退出时看到错误。我可以从编译器的角度理解这个解决方案是有问题的。

我不确定如何让它工作,或者是否有可能让它工作。我看到有人建议在类似情况下使用“索引技巧”,但我无法在这个特定场合下使用它。

感谢任何帮助!

最佳答案

您所采取的方法本身就非常明智、安全和可靠。例如,下面的程序使用可变模板参数并将它们转发给 std::printf(),这是一个接受可变数量参数的 C 风格函数:

#include <utility>
#include <cstdio>

template <unsigned int S, typename ...T>
void my_printf(const char (&fmt)[S], T&&... args) {
std::printf(fmt, std::forward<T>(args)...);
}

int main(int argc, const char* argv[]) {
my_printf("Hello, %s!\n", "World!");
my_printf("I will count to %u...\n", 10);
for (int i = 0; i < 10; ++i)
my_printf("%s %s %u\n", "...", "and", i + 1);
my_printf("And here are my arguments :)\n");
for (int i = 0; i < argc; ++i)
my_printf("argv[%u] == %s\n", i, argv[i]);
}

未定义行为和可能的堆栈损坏问题是由其他原因引起的。在 C++ 中,这很可能是通过 C 的变量参数列表传递非 POD 类型引起的(即将 std::string 传递给 printf() 可以做到这一点)。

不幸的是,编译器扩展如 "format attribute"不会在这里帮助。但是编译器可能会警告您非 POD 类型。例如,使用 std::string 调用 my_printf(),您将收到类似如下的警告:

./test.cc:7:46: error: cannot pass objects of non-trivially-copyable type ‘class std::basic_string<char>’ through ‘...’
std::printf(fmt, std::forward<T>(args)...);

^

当然,编译器可能无法为您捕捉到其他情况。不幸的是,没有比调试您的程序并查看究竟是什么导致它崩溃更好的方法了。

既然你正在进入 C 的黑暗水域并且传递不安全的参数,调试器是你的 friend ,我也建议你使用 Valgrind - 捕捉这样的东西非常有帮助。

希望对您有所帮助。祝你好运!

关于c++ - 使用 C++11 将可变函数参数转发给可变函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20379961/

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