gpt4 book ai didi

c++ - 带有可变参数模板的奇怪的重复模板模式 (C++)

转载 作者:行者123 更新时间:2023-11-27 22:50:24 27 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>

template <typename Derived>
struct Base {
void print() const { static_cast<const Derived*>(this)->print(); }
};

struct Value : public Base<Value> {
int i;
void print() const { std::cout << "Value: " << i << std::endl; }
Value(int j) : i(j) {}
};

void do_variadic_thing() {}

template <typename Derived, typename... Args>
void do_variadic_thing(const Base<Derived>& b, Args... args) {
std::cout << "Inside do_variadic_thing" << std::endl;
b.print();
do_variadic_thing(args...);
}

template <typename Derived>
void do_thing(const Base<Derived>& b) {
std::cout << "Inside do_thing" << std::endl;
b.print();
do_variadic_thing(b, b, b);
}

int main(int argc, char** argv) {
do_thing(Value(1));
}

此代码使用 Curiously Recurring Template Pattern 定义一个编译时多态类,其方法称为 print .

我想做的是运行 print来自具有可变数量参数(do_variadic_thing)的函数的方法。上面提供的代码可以编译,但会产生奇怪的输出:

Inside do_thing
Value: 1
Inside do_variadic_thing
Value: 1
Inside do_variadic_thing
Value: 4206337
Inside do_variadic_thing
Value: 4206337

我不明白为什么在 do_variadic_thing 中的第二次递归调用后打印的值发生变化。 .参数b被复制 3 次;它的类型也是相同的(即 Base<Value> )。似乎不知何故,在第二次调用之后,参数不再引用一些有效的内存。

这怎么可能?

最佳答案

通过引用传递:

void do_variadic_thing(const Base<Derived>& b, const Args&... args)
^
here

关于c++ - 带有可变参数模板的奇怪的重复模板模式 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37712684/

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