gpt4 book ai didi

c++ - 实现模板化模板方法

转载 作者:太空狗 更新时间:2023-10-29 20:10:25 26 4
gpt4 key购买 nike

注意:下面的问题是关于Template Method Design Pattern的和 C++ 函数模板。为区分两者,我将在提及设计模式时使用斜体,在提及 C++ 模板时使用粗体

模板方法模式的思想是让算法的各个部分可以互换。这通常是通过继承实现的,其中子类提供插入基类算法的具体实现。但是,如果 Hook 方法需要是模板,这将不起作用,因为模板不能是虚拟的。这是一个无法编译的简单示例:

class Base
{
public:

// This is the template method
template <typename T>
void doSomething(T input)
{
//...
auto converted = ConvertInput(input);
//...
std::cout << converted;
}

protected:
//compile error "member function templates cannot be virtual"
template <typename T>
virtual T ConvertInput(T input) = 0;
};

class Derived : public Base
{
protected:
template <typename T>
T ConvertInput(T input)
{
return 2 * input;
}
};

int main()
{
Derived d;
d.doSomething(3);
}

有没有办法实现使用函数模板 Hook 的模板方法

我对在任何地方使用 Base 类作为类型不感兴趣。我将始终使用具体的特定类型来实现最大的编译时优化。所以这个问题的另一种表述是:如何创建多个类 Derived-1 .. Derived-n,它们具有在实现中共享通用代码框架的函数模板

最佳答案

听起来像是 CRTP 的一个很好的用例.将 Base 定义为类模板,并将派生自它的类型作为模板参数。在 Base 的方法中,您可以向下转换为派生类型:

template<typename Derived>
struct Base
{
// This is the template method
template <typename T>
void doSomething(T input)
{
//...
auto converted = static_cast<Derived*>(this)->ConvertInput(input);
//...
std::cout << converted << std::endl;
}
};

然后定义派生类型,例如:

struct Square : Base<Square>
{
template<typename T>
auto ConvertInput(T t)
{
return t*t;
}
};

struct Sum : Base<Sum>
{
template<typename T>
auto ConvertInput(T t)
{
return t+t;
}
};

用法非常简单:

Square sq;
Sum sum;
sq.doSomething(3);
sum.doSomething(3);

live demo

关于c++ - 实现模板化模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40075202/

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