首页 > 解决方案 > 关于模板、容器和继承的 C++ 设计问题

问题描述

关于我编写的接口算法类和第三方 API,我的设计存在问题。我将编写一些伪代码来帮助解释我的问题。如果可能的话,我宁愿不参与boost

问题

我有一个我将调用的算法类Alg(它可以被认为是一个搜索/优化算法)和一个我将调用的“超级”算法类SuperAlg,它Algstd::vector<Alg>. 评估SuperAlg函数依赖于第三方算法,因此需要将任意数量的这些Alg类对象的结果转换为第三方类型。每个都Alg可能与不同的第三方类型相关联,这在Alg类对象的构建时是已知的。评估SuperAlg函数看起来像:

double SuperAlg::evaluate(const std::vector<AlgResultType>& input) {
    ThirdPartyValues values;
    for (const auto& i : input) {
        values.insert(convert(i));
    }
    ThirdPartyAlg alg;
    return alg.error(values);
}

这里:

有很多这些第三方类型,假设我知道类型并且有Alg搜索结果 ( AlgResultType),我就知道如何执行转换。即convert函数已知:

ThirdPartyType convert<ThirdPartyType>(const AlgResultType& result);

根本问题是:如何指定i需要转换为 in的类型SuperAlg::evaluate?回想一下,这种类型在每个构建时都是已知的,Alg并且需要以某种方式保留。

一些解决方案的想法

编辑

感谢@Evg 将我指向std::variantand std::visit。我现在有一个可行的,虽然不是很优雅的解决方案,但在课堂上保持std::vector<std::variant<Alg<ThirdPartyType1>, Alg<ThirdPartyType2>, ...>>SuperAlg公开该ThirdPartyType convert(const AlgResultType& result)功能Alg

这个解决方案的丑陋之处在于,Alg要从内部调用任何成员函数SuperAlg,我需要为该成员函数创建一个 lambda 函数,Alg然后使用std::visit(lambda, alg_variant)

标签: c++design-patternstypes

解决方案


推荐阅读