2017-10-18 18 views

답변

1

TI 사이트에서이 주제에 관해 많이 알지 못하거나, 최소한, 자세하고 정확한 응답을주기에는 충분하지 않습니다.

임베디드 ABI의 구현은 주로 Itanium C++ ABI의 파생어 인 this document에 설명되어 있습니다. 람다 구현이나 auto 키워드에 대해서는 아무 것도 설명하지 않습니다. (또는 아마이 정보를 문서에서 얻을 수 없습니다.)

따라서 Energia에서 직접 시험으로 결정했습니다. 분명히 g++ 버전은 4.6.3이므로 두 버전을 모두 지원해야합니다.

// In template.hpp 
#ifndef TEMPLATE_HPP_ 
#define TEMPLATE_HPP_ 

template<class T> 
T func(T a) { 
    auto c = [&](int n) { return n + a; }; 
    return c(0); 
} 

#endif /* TEMPLATE_HPP_ */ 

// in the sketch main 
#include "template.hpp" 

void setup() { int b = func<int>(0); } 
void loop() { }  

(템플릿에만 헤더의 경우 작동합니다

그리고 사실

처럼 뭔가를 컴파일 할 수 있습니다 (보기의 편집 지점에서, 나는 코드를 테스트하기 위해 여기 내 MSP가 없습니다) , 메인 스케치에서 오류가 발생합니다). 이 스케치를 컴파일하기 위해 에디터의 하나의 내부 파일을 수정해야했습니다. 최대 지원 기준은 -std=c++0x 것 같다 및 컴파일 플래그는 파일에 내 설정에서

$ENERGIA_ROOT/hardware/energia/msp430/platform.txt 

루트 /opt/energia입니다. 그 파일 안에는 32 (compiler.cpp.flags) 줄을 수정하고 옵션을 추가했습니다. -std=c++11은 지원되지 않습니다 (오류 발생).

compiler.cpp.flags=-std=c++0x -c -g -O2 {compiler.mlarge_flag} {compiler.warning_flags} -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD 

불행하게도 나는 그래서 당신이 그것을 모방 클래스의 어떤 종류를 작성해야, 제공되지 embedXcode :\

모방 std::function

std::function 제로 경험이 있습니다. 뭔가 같은 :

// callback.hpp 
#ifndef CALLBACK_HPP_ 
#define CALLBACK_HPP_ 

template <class RET, class ARG> 
class Callback { 
    RET (*_f)(ARG); 

    public: 
    Callback() : _f(0) { }; 
    Callback(RET (*f)(ARG)) : _f(f) { }; 
    bool is_set() const { return (_f) ? true : false; } 
    RET operator()(ARG a) const { return is_set() ? _f(a) : 0; } 
}; 

#endif /* CALLBACK_HPP_ */ 

// sketch 
#include "callback.hpp"   
           // | !! empty capture! 
void setup() {    // V 
    auto clb = Callback<int, char>([](char c) { return (int)c; }); 
    if (clb.is_set()) 
    auto b = clb('a'); 
} 

void loop() {} 

이 작업을 할 수 있으며,이 간단한 트릭을 사용

없는 람다 캡처 람다 표현 닫는 방법의 종류는 공공 가상이 아닌 비를 가지고 -explicit const 변환 함수 이 동일한 매개 변수를 갖는 함수에 대한 포인터와 클로저 유형의 함수 호출 연산자와 같은 반환 유형을가집니다. [C++ 11 표준 5.1.2]

캡처를 비워두면 함수 포인터로 "변환"할 수 있으므로 문제없이 저장할 수 있습니다.내가 작성한 코드 :

  • 는 반환 유형
  • 에게 콜백에 대한 하나 개의 인수 인 제 2 템플릿 ARG을 필요로하는 첫 번째 템플릿 RET이 필요합니다. 대부분의 경우 void*을 공용 인수로 사용할 수 있습니다 (void 포인터에서 구조체 포인터를 캐스팅하여 인수로 사용하여 함수에서 카운터 캐스팅을 수행하면 아무런 비용도 들지 않습니다)
  • 은 두 개의 생성자를 구현합니다. 빈 생성자는 NULL으로 함수 포인터를 초기화하고 두 번째는 직접 콜백을 할당합니다. 복사 생성자가 누락되었으므로이를 구현해야합니다.
  • 은 함수를 호출하고 (연산자를 오버로드하는 ()) 메소드를 구현하고 콜백이 실제로 존재하는지 확인합니다.

는 다시 : 이 물건은 경고없이 컴파일하지만 그것은 MSP430에 작동하는 경우에 나는 그것을 테스트 할 수 있기 때문에 내가 (그것이 일반적인 AMD64 리눅스 시스템에서 작동), 모르겠어요.

+0

하 나는'-std = C++ 0x'에 관한 부분을 알아내는 것을 끝내었지만 당신 앞에 답을 게시 할 기회를 얻지 못했습니다. 나는 실제로 반원으로서 람다를 저장할 수 있다는 이점을 얻을 수있는 상황에 처하게되었습니다. std :: function (어떻게 stl이 없기 때문에)없이 이것을 어떻게 할 수 있습니까? – Alexander

+0

자신의 클래스로'std :: function'을 모방 한 것일까 요? (답 참조) –