首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免模板的扩散

避免模板的扩散
EN

Stack Overflow用户
提问于 2015-04-24 17:16:09
回答 1查看 398关注 0票数 2

我正在处理一个相当紧密耦合的库,到目前为止,这个库已经明确地假定所有的计算都是用双数完成的。我正在将一些核心类转换为模板,以便我们可以开始使用std::complex<double>进行计算。到目前为止,我已经设计了大约10个类的模板,注意到了模板扩散的趋势。当一个类变得模板化时,使用模板类的任何其他类似乎也需要模板。我认为可以通过为模板定义抽象基类来避免这种扩散,这样其他类就可以只使用指向抽象类的指针,然后引用派生类的doublestd::complex<double>版本。这似乎是在头级别进行的,但是当我深入到源文件中时,模板类通常会有计算doublestd::complex<double>类型值的值或容器的函数。仅仅因为源文件中的几行代码与其他类的返回类型不同,对整个类进行模板似乎是一种浪费。

使用auto似乎是解决这一问题的一种可能的方法,但我不能100%肯定它会起作用。假设我有一个抽象基类AbstractFunctionFunction<Scalar>是从它派生的,其中Scalar可以是doublestd::complex<double>。现在假设我们有两个成员函数:

代码语言:javascript
复制
virtual Scalar Function<Scalar>::value(double x);
virtual void Function<Scalar>::values(std::vector<Scalar> &values, std::vector<double> x);

假设我有一些其他类(我不想模板),它有一个成员函数来调用其中的一个。

代码语言:javascript
复制
// populate double x and std::vector<double> xs
auto value = functionPtr->value(x);
std::vector<auto> values;
functionPtr->values(values, xs);
// do something with value and values

其中functionPtr的类型为std::shared_ptr<AbstractFunction>。我可以看到auto在第一种情况下工作,但我不相信我能构造一个auto向量来填充第二种情况。这是否需要使调用类成为模板?有人能推荐另一种策略来减少模板的扩散吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-24 19:38:30

我认为您已经错误地假设第一个用例将起作用。如果您有一个抽象基类,那么要么value是它的成员,然后您可以通过std::shared_ptr<AbstractFunction>调用它,要么value不是它的成员,并且只有当您知道派生类的类型时才可用。在第一种情况下,AbstractFunction::value方法必须有固定的返回类型,它不能依赖于Scalar,后者是派生类的模板参数。

话虽如此:在我的经验中,这两个概念往往不能很好地混合在一起。您希望创建一个具有完整接口的抽象基类,或者希望创建一个模板。在后一种情况下,拥有抽象基类通常没有必要/没有好处。然后,使用模板的代码也与模板一起工作。

帮助您的是从Function“导出”模板参数,即

代码语言:javascript
复制
template<typename T>
class Function
{
public:
    using value_type = T;
    value_type value() const;
    // ...
};

在代码的其他部分中,使用一个模板,如果您不想直接写出(并限制自己)到T中,则使用任何行为类似于FunctionFunction

代码语言:javascript
复制
template<typename T>
void something( const std::shared_ptr<T>& functionPtr )
{
   // ignoring where x comes from...
   using V = typename T::value_type;
   V value = functionPtr->value(x);
   std::vector<V> values;
   functionPtr->values(values, xs);
}

请注意,这只是一个选项,我不知道这是否是您的用例的最佳选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29853609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档