带有可变参数模板的奇怪的重复模板模式 (C++)
Curiously recurring template pattern with variadic templates (C++)
我有如下一段代码:
#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 定义一个编译时多态 class 和一个名为 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>
)。似乎不知何故,在第二次调用之后,参数不再引用一些有效的内存。
这怎么可能?
您正在按值传递 second/third 个实例 - 考虑如何构建副本。
通过引用:
void do_variadic_thing(const Base<Derived>& b, const Args&... args)
^
here
变量b
的类型是Base<Value> const&
,但它引用的对象是Value
类型。当你复制 b
将它复制到 do_thing
里面时,你是在 切片 它;也就是说,只复制 Base<Value>
部分。
我有如下一段代码:
#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 定义一个编译时多态 class 和一个名为 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>
)。似乎不知何故,在第二次调用之后,参数不再引用一些有效的内存。
这怎么可能?
您正在按值传递 second/third 个实例 - 考虑如何构建副本。
通过引用:
void do_variadic_thing(const Base<Derived>& b, const Args&... args)
^
here
变量b
的类型是Base<Value> const&
,但它引用的对象是Value
类型。当你复制 b
将它复制到 do_thing
里面时,你是在 切片 它;也就是说,只复制 Base<Value>
部分。