我正在尝试很长时间来理解生成器表达式的好处, 例如$<xxx:yy>在CMake中,何时以及如何使用它们.任何人都可以通过一些例子清楚地解释清楚.非常感谢
我正在构建一个可以通过添加新类来扩展的c ++框架
我想找到一种简化新类扩展的方法.
我目前的代码如下:
class Base {
public:
virtual void doxxx() {...}
};
class X: public Base {
public:
static bool isMe(int i) { return i == 1; }
};
class Y: public Base {
public:
static bool isMe(int i) { return i == 2; }
};
class Factory {
public:
static std::unique_ptr<Base> getObject(int i) {
if (X::isMe(i)) return std::make_unique<X>();
if (Y::isMe(i)) return std::make_unique<Y>();
throw ....
}
};
Run Code Online (Sandbox Code Playgroud)
此外,对于每个新类,都必须添加新的if语句.
现在我想找到一种方法来重写我的Factory类(使用元编程),可以通过调用add方法来完成添加新类,并且工厂类看起来像跟随伪代码:
class Factory
{
public:
static std::unique_ptr<Base> getObject(int i) {
for …Run Code Online (Sandbox Code Playgroud) 在寻找在容器中存储 CRTP 对象的方法时,我发现了以下问题:
\n\n\n\n我尝试了标记的解决方案
\n\n\n\n但编译器抱怨错误如下:
\n\nno known conversion for argument 1 from \xe2\x80\x98std::shared_ptr<DerivedA>\xe2\x80\x99 to \xe2\x80\x98const std::shared_ptr<BaseInterface>&\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的尝试:
\n\n#include <vector>\n#include <memory>\n\nstruct BaseInterface {\n virtual ~BaseInterface() {}\n virtual double interface() = 0;\n};\n\ntemplate <typename Derived>\nclass Base : BaseInterface {\npublic:\n double interface(){\n return static_cast<Derived*>(this)->implementation();\n}\n};\n\nclass DerivedA : public Base<DerivedA>{\npublic:\n double implementation(){ return 2.0;}\n};\n\nclass DerivedB : public Base<DerivedB>{\npublic:\n double implementation(){ return 1.0;}\n};\n\n\nint main() {\n std::vector<std::shared_ptr<BaseInterface>> ar;\n ar.emplace_back(std::make_shared<DerivedA>());\nreturn 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n您知道如何修复编译器错误,或者如何更好地解决问题吗?\n提前致谢
\n