gpt4 book ai didi

c++ - 使用 CRTP 模拟类

转载 作者:行者123 更新时间:2023-11-30 05:44:43 24 4
gpt4 key购买 nike

我正在尝试模拟没有任何虚函数的类。我读过Curiously_recurring_template_pattern (CRTP) 可以帮助实现这一目标。

这是代码。我正在尝试对函数 getMyClassValue

进行单元测试
// file myclass.h
template<typename T>
struct MyClass_t {
int hello() {
return (static_cast<T*>(this))->hello_impl();
}
};

/*
Earlier MyClassImpl was just simple class like
struct MyClassImpl {
int hello() {
return 110;
}
};

// I changed it to below for making it mockable. Using CRTP.
*/

struct MyClassImpl : public MyClass_t<MyClassImpl> {
int hello_impl() {
return 110;
}
};

typedef MyClassImpl *MyClass;

int getMyClassValue(MyClass doc) {
return doc->hello();
}

// file main.cpp
#include <iostream>
/*
int main() {
MyClass myclass = new MyClassImpl();
std::cout << getMyClassValue(myclass);
delete myclass;
return 0;
}
*/

// file test.cpp
struct MyClassImplTest : public MyClass_t<MyClassImplTest>,
public virtual MyClassImpl {
int hello_impl() {
return 2;
}
};

int main() {
auto myclass = new MyClassImplTest();
std::cout << getMyClassValue(myclass);
delete myclass;
return 0;
}

我在控制台中得到的是 110 而不是 2。为什么会这样?由于我使用的是指针,因此不应发生切片。

我如何实现模拟?

最佳答案

的确,这和切片无关。发生的事情非常简单,真的:

  • getMyClassValue接受类型为 MyClassImpl* 的指针并调用 hello
  • 调用解析为 helloMyClassImpl 的父级中这是MyClass_t<MyClassImpl>
  • hello static 将指针转换为 T*这是MyClassImpl*并调用 hello_impl
  • MyClassImpl::hello_impl返回 110

调用hello无法解析为 MyClass_t<MyClassImplTest> MyClassImplTest 的 parent 因为它是在 MyClassImpl* 类型的指针上调用的而不是 MyClassImplTest 类型的指针.正在尝试调用 helloMyClassImplTest*除非您指定要使用哪个父级,否则也不会工作,因为调用会产生歧义。

使用虚函数实现模拟很简单。没有,没有那么多。

关于c++ - 使用 CRTP 模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29645331/

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