gpt4 book ai didi

c++ - 奇怪的重复模板模式乘以两倍

转载 作者:行者123 更新时间:2023-11-30 02:58:05 27 4
gpt4 key购买 nike

我有一般设计问题。我正在尝试实现这样的东西:

                  ------------
|Base Class|
------------
|
------------------
| |
----------- -----------
|SubClass1| |SubClass2|
----------- -----------
| |
-------------- --------------
|SubSubClass1| |SubSubClass2|
-------------- --------------

其中基类提供虚函数,子类提供实现,子类为实现提供常量。

我想过两次像这样使用“Curiously Recurring Template Pattern”:

// header baseclass.h
template <typename subclass>
class baseclass {
private:

public:

virtual double GetQuantity1(double given1, double given2) = 0;

virtual double GetQuantity2(double given1) = 0;

}

// header subclass1.h
template <typename n>
class subclass1:public baseclass<subclass>{
private:

private1(double, double);

public:

double GetQuantity1(double given1, double given2);

double GetQuantity2(double given1);

}

// header subsubclass1.h
class subsubclass1:public subclass1<subsubclass1>{
private:

public:

double constant1;

double constant2;
}

然后我会在使用代码时调用 Subsubclass::GetQuantity1()。

像这样的东西是犹太洁食还是有更好的方法来做这样的事情?

非常感谢。

最佳答案

这样做很好,而且我看不出这样做有什么普遍的缺点。我只是不明白您实际使用 CRTP 的位置以及为什么简单的虚拟继承不适用于您的用例(CRTP 通常用作静态多态性)。

也不明白你的意思

private1(double, double);

在您的 subclass1 中,您指的是构造函数吗?就目前而言,它在实例化时不会编译(除了构造函数或析构函数之外,不允许没有返回值的函数)。

另一个批评者是:如果你指的是常量,你应该在子子类中声明 conststatic const 成员。

由于您没有明确指定您的特定用例,所以很难说什么才是真正的最佳设计。 我可以提供一个从尝试遵循您的想法中掌握的替代方案:

// header baseclass.h
template <typename subclass>
class baseclass {
public:

inline double GetQuantity1(double given1, double given2) {
// may be add a static check for GetQuantity1_Impl with a traits
// check on subclass.
return static_cast<subclass*>(this)->GetQuantity1_Impl(given1,given2);
}

inline double GetQuantity2(double given1) {
return static_cast<subclass*>(this)->GetQuantity2_Impl(given1);
}

// You also can provide default implementations, otherwise the interface
// method will be required from subclass to compile correctly
inline double GetQuantity1_Impl(double given1, double given2) {
// ...
}
};

// header subclass1.h
template<double const1, double const2>
class subclass1:public baseclass<subclass1>{
public:
subclass1() {}

double GetQuantity1_Impl(double given1, double given2) {
return 0.0; // Apply formula using the constants instead of 0.0
}
double GetQuantity2_Impl(double given1) {
return 0.0; // Apply formula using the constants instead of 0.0
}
};

// Client implementation file
// No need for subsubclass1 just instantiate for usage

subclass1<0.3, 3.1415> myAlgo;
// A client calls the public interface of the (implicit) base class
double result1 = myAlgo.GetQuantity1(23.2,42);
double result2 = myAlgo.GetQuantity2(2.71828);

消除基类中的纯虚方法定义,并用检查子类模板参数的静态接口(interface)('traits')代替它们。

关于c++ - 奇怪的重复模板模式乘以两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14026687/

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