>source

내 C ++ 프로젝트에는 Expression이라는 유형이 있습니다.

typedef std::function<uint64_t(uint64_t)> Expression;

또한 생성자처럼 작동하는 함수가 있습니다.

Expression ExpressionConstructor(std::string Expr, MicroCodeDescriptor* descriptor) {
//implementation doesn't matter in this case
}

이 코드는 작동하며 다음과 같이 Expression 유형을 사용할 수 있습니다.

Expression expr= ExpressionConstructor(code, descriptor);

그러나 구문 적으로 별도의 함수가 아닌 생성자처럼 작동하는 Expression에 대한 생성자를 선언하는 방법이 있습니까? 생성자가 생성하는 클래스의 반환 유형이있는 함수일 뿐이므로 이것이 근본적으로 불가능한 이유를 알 수 없습니다. .

  • 답변 # 1

    대신에 typedef Expression은 다음에서 파생 된 클래스 일 수 있습니다. std::function<uint64_t(uint64_t)> . 그런 다음 정의 할 수 있습니다.생성자,폐물 소각로그리고 그것을 std::function :

    struct Expression : public std::function<uint64_t(uint64_t)>
    {
        Expression(std::string Expr, MicroCodeDescriptor* descriptor)
        {
        }
    };
    Expression e = Expression("", nullptr);
    uint64_t res = e(123);
    
    

    또는 더 나은 템플릿 만들기 :

    template<typename R = uint64_t, typename T = uint64_t>
    struct Expression : public std::function<R(T)>
    ...
    
    

  • 답변 # 2

    typedef 새로운 유형이 아니라 별칭을 생성합니다. Expression 여전히 유형입니다 std::function<uint64_t(uint64_t)> .

    I don't see any reason why this is fundamentally impossible as constructors are just functions with the return type of the class they construct.

    그것은 근본적으로 불가능한 것은 아니지만 (사양이 그러한 것을 허용 할 수 없다는 의미에서), 사양에 주어진 그러한 기능이 없기 때문에 당신은 그것을 할 수 없습니다. 기존 유형에 새 멤버 함수를 추가 할 수없는 것과 같습니다.

  • 이전 python - 데이터 프레임의 구조 변경
  • 다음 unicode - 파이썬 3에서 이러한 문자열을 구문 분석하여 이미`\\ x`로 문자열에있는 16 진수 문자를 변환하는 방법