gpt4 book ai didi

c++ - 为支持多种 POD 类型同时最大限度地提高二进制兼容性,面向公众的 API 的推荐设计是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:20 25 4
gpt4 key购买 nike

我目前正在为需要预编译二进制文件/DLL(它将是跨平台的)的产品设计一个面向公众的 C++ API。我希望 API 允许用户使用我们支持的任何 POD(如果适用),但是基本要求是最大的灵 active 和二进制兼容性。我正在做的事情有点类似于 CPLEX 的 API(这是几个灵感之一),但我认为可能有比他们如何做的更好的指定类型信息的方法(关于 IloInt、IloNum、IloAny、Ilo* Var 等,请参阅 link(希望是 IloExtractable 分支),而不会影响二进制兼容性。我错了吗?我想到了一些东西,但我不记得它是什么,或者它是否会起作用,我相信它类似于访问者或装饰者模式,但对于类型,有人可以在这个问题上启发我吗?我面前有 GoF 的《设计模式》一书。

注意:这里可能存在的任何语法错误都不是当前问题的一部分。

我认为我不能使用的示例及其原因:

可能..但这可能会使表达式树变得复杂。

template<typename ValueType>
Constraint : public Expression;

可能会影响 future 的扩张。

IntConstraint : public Expression;
LongConstraint : public Expression;
DoubleConstraint : public Expression;

丑陋如罪,可能会导致很多微妙的问题。

union Value
{
int AsInt,
float AsFloat
};
class Constraint : public Expression
{
public:
Value GetValue(Edge);
void SetValue(Value, Edge);
void SetUpper(Value, Vertex);
void SetLower(Value, Vertex);
...
};

编辑:响应 Mads Elvheim(并在找到 this link 之后)我现在意识到我不需要从我的可能性中排除模板,这很好,但我仍然不确定这是最好的主意 - 至少对于 Constraints 类(尽管它在概念上是合理的),请原谅我没有我想的那么清楚。

为了使我的 API 易于使用,我使用 bnf 定义了语法(这对我来说是相当新的)。这导致了表达式、约束和其他将包含的与约束交互的类的抽象语法树。因为其他类将与约束交互,所以我宁愿在“最后一分钟”之前尽可能避免传递 munch 类型信息。可以这么说。我觉得我可能缺少抽象级别。

研究 CPLEX 给我的印象是,他们通过遵循数字域(整数和实数)、线性方程表达式(当然)以及相应的可能的东西来建模他们的类型,这绝对有道理,嗯......

(显然我不能发布多个链接,因为我是一名新用户。)

编辑 2:作为第一步,我决定在 Constraint 和 Expression 类之间添加一个 ConstraintExpressionArgument,这样我仍然可以在我的表达式树中识别一个约束,而无需知道它的类型操纵哪个好。

我可能忽略提及的另一个细节是,与 CPLEX 中的 Constraint 类本身不可用不同,我的 Constraint 类目前是一个可用的用户类,但就像在 CPLEX 中一样,我也想为扩展留出空间(因此输入问题)...

无论如何,此刻我有相当于

class ConstraintExpressionArgument : public Expression;
template<typename ValueType>
class Constraint : public ConstraintExpressionArgument;

最佳答案

大多数系统提供一个 <types.h><inttypes.h>如果确切的范围或位数很重要,则可以使用带有类型定义的 header 。我没有看到一个很好的理由来解决这个问题。您也可以使用 std::numeric_limits连同 Boost 的 BOOST_STATIC_ASSERT()如果指定的类型或模板类型不符合要求,则生成有意义的编译时断言的宏。要求可以是整数与 float 、范围、最小可表示值、精度等。例如:

#include <limits>
#include <inttypes.h>
#include <boost/static_assert.hpp>

template<class T, int bits> T Add(const T& a, const T& b)
{
BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_integer );
BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_signed );
BOOST_STATIC_ASSERT( std::numeric_limits<T>::digits == bits );

return a + b;
}

如果 std::numeric_limits 没有您的所有类型,请使用模板特化来扩展和实现它们。

关于c++ - 为支持多种 POD 类型同时最大限度地提高二进制兼容性,面向公众的 API 的推荐设计是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563491/

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