代码之家  ›  专栏  ›  技术社区  ›  Geoff

对于面向公众的API,建议采用什么设计来支持多种POD类型,同时最大限度地提高二进制兼容性?

  •  2
  • Geoff  · 技术社区  · 16 年前

    link

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

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

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

    template<typename ValueType>
    Constraint : public Expression;
    

    可能会影响未来的扩张。

    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

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

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

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

    编辑2:作为第一步,我决定坚持 ConstraintExpressionArgument

    另一个我可能忽略提到的细节是,与CPLEX中约束类本身不可用的情况不同,我的约束类当前是一个可用的用户类,但与CPLEX中一样,我也想留出扩展空间(因此存在键入问题)。。。

    不管怎么说,目前我有相当于

    class ConstraintExpressionArgument : public Expression;
    template<typename ValueType>
    class Constraint : public ConstraintExpressionArgument;
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Mads Elvheim Mads Elvheim    16 年前

    大多数系统提供 <types.h> <inttypes.h> 如果精确范围或位数很重要,则可以使用带有类型定义的标头。我看不出有什么好的理由把继承问题抛在脑后。你也可以使用 std::numeric_limits 与Boost的 BOOST_STATIC_ASSERT() 宏生成有意义的编译时断言,如果指定的类型或模板类型与要求不匹配。要求可以是整数与浮点、范围、最小可表示值、精度等。例如:

    #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没有所有类型,请使用模板专门化来扩展和实现它们。

        2
  •  0
  •   Geoff    16 年前

    上述

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