2009-10-13 2 views
2

저는 현재 컴파일 된 바이너리/DLL (크로스 플랫폼이 될 것입니다)이 필요한 제품을위한 공용 C++ API를 설계하고 있습니다. API가 우리가 지원하는 모든 POD를 사용할 수 있도록하고 싶지만, 기본 요구 사항은 최대한의 유연성과 이진 호환성입니다. 나는 CPLEX의 API와 비슷한 것을하고있다. (그것이 여러 가지 영감 중 하나이다.) 그러나 ILEInt, IloNum, IloAny, Ilo *와 관련하여 유형 정보를 지정하는 것보다 더 나은 방법이있을 수 있다고 생각한다. Var 등등, 이진 호환성을 망칠없이 link (잘만되면) IloExtractable branch를 보라). 내가 잘못? 나는 마음에 무엇인가 가지고있다. 그러나 그것이 무엇인지를 기억하지 못한다. 또는 그것이 작동 할지라도, 나는 그것이 방문자 또는 장식 자 패턴과 유사하다고 믿는다. 그러나 유형을 위해, 누군가 주제에 나를 계몽시킬 수 있었느냐? 나는 내 앞에서 GoF에 의한 디자인 패턴 책을 가지고있다.바이너리 호환성을 극대화하면서 다중 POD 유형을 지원하기 위해 공용 지향 API에 권장되는 설계는 무엇입니까?

참고 : 여기에 구문 오류가있는 것은 문제의 일부가 아닙니다.

내가 사용할 수 없습니다 믿는의 예와 그 이유는 아마도

..하지만이 식 트리로 일을 복잡하게 만들 가능성이있다.

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을 찾은 후) 지금은 내가 좋은 내 가능성에서 템플릿을 제외 할 필요가 없습니다 실현,하지만 난 여전히 최고의 생각보다는 확실하지 오전 - 적어도 Constraints 클래스의 경우 (개념적으로는 소리 나는데도), 생각만큼 명확하지 않은 것을 용서해주십시오.

내 API를 사용하기 쉽게하기 위해 bnf를 사용하여 문법을 정의했습니다. 이로 인해 Expression, Constraints 및 Constraints와 상호 작용할 다른 클래스에 대한 추상 구문 트리가 생성되었습니다. 다른 클래스가 Constraints와 상호 작용할 것이기 때문에 가능한 한 뭉크 타입 정보로 넘어가는 것을 피하는 것이 좋습니다. 말하자면 "마지막 순간"입니다. 나는 추상화 수준을 놓칠 수있는 것처럼 느낍니다.

CPLEX를 배우는 것은 숫자 (전체 및 실제), 선형 방정식 표현 (물론)의 도메인을 따르고 그로 인해 가능해야하는 것, 절대적으로 의미있는 것, 흠 ...을 모델링 한 느낌을줍니다.

(나는 새로운 사용자입니다로 분명히 두 개 이상의 링크를 게시 할 수 없습니다.)

편집 2 : 첫 번째 단계로 나는 제약 및 표현 클래스 사이에 ConstraintExpressionArgument을 고수하기로 결정했습니다 그래서 나는 그것이 조작하는 타입을 잘 알지 못하고 표현 트리의 제약을 여전히 식별 할 수 있습니다.

내가 언급하지 않은 또 다른 세부 사항은 Constraint 클래스가 단독으로 사용할 수없는 CPLEX와는 달리 내 Constraint 클래스는 현재 사용 가능한 사용자 클래스이지만 CPLEX와 마찬가지로 확장 할 공간도 남겨두고 싶습니다 (따라서 타이핑 문제) ...정확한 범위 나 비트 수가 중요한 경우

어쨌든, 지금 내가

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

사용자가 조건을 설정할 수있게하고 싶지만 제약 조건에 전달 된 값을 int 또는 float와 같은 POD로 허용 하시겠습니까? 이들 제약 조건을 동시에 혼합 및 일치시킬 수 있습니까? POD 데이터 유형 세트는 꽤 고정되어 있습니다. 정말로 그 방향으로 확장 성이 필요합니까? –

+0

맞아요. 그렇다면 믹스 앤 매치가 가능합니다. 부동 소수점을 사용자 선택에서 제외 할 수 없기 때문에 cplex가 IloInt와 같이 긴 값만 제공 할 수 있지만 여러 유형을 사용하는 옵션을 제공하는 가장 완벽한 방법을 찾고 있습니다. – Geoff

+0

링크 [1]은 다음 위치에 있습니다. http://www.mat.uc.pt/~jsoares/teaching/software/cplex/doc/html/refconcert/html/graph.html – Geoff

답변

0

맞아, 나는 적어도 내가 필요로하는 것이 있다고 생각한다.

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

이 제약 다움에서 유형을 분리에 바른 길에 저를 얻었다 언급했다.

2

대부분의 시스템에 해당하는가하면, 당신이 사용할 수있는 타입 정의와 <types.h> 또는 <inttypes.h> 헤더를 제공합니다. 나는 문제에 대한 상속을 던질 좋은 이유가 없다. 지정된 타입이나 템플릿 타입이 요구 사항과 일치하지 않는 경우, std::numeric_limits을 부스트의 BOOST_STATIC_ASSERT() 매크로와 함께 사용하여 의미있는 컴파일 타임 어설 션을 생성 할 수 있습니다. 표준 : : numeric_limits 귀하의 모든 유형이없는 경우

#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; 
} 

, 사용 템플릿 특수화 연장하고이를 구현하기 : 요구 사항은 예를 들어 등 플로트, 범위 대 정수, 최소 표현 가능한 값, 정확성, 수 .

+0

구현에 부스트를 사용하고 있지만 오히려 public (read : user) API에서 Boost에 대한 의존성을 피하는 것이 좋습니다. – Geoff