2017-10-18 122 views

回答

1

在TI網站上沒有太多有關此主題的內容,或者至少我不知道足夠多的C++爲您提供詳細而準確的響應。

嵌入式ABI的實現在this document中描述,主要是衍生Itanium C++ ABI。它沒有說明lambdas的實現,也沒有說明關鍵字(或者我可能無法從文檔中獲取這些信息)。

因此,我決定直接測試在Energia。顯然g++版本是4.6.3,因此它應該支持兩者。

而且實際上(從一個編輯點,我沒有我的MSP這裏測試的代碼),它可以編譯這樣的:

// 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() { }  

(模板工程只有在頭,在主草圖中產生錯誤)。爲了編譯這個草圖,我不得不修改編輯器的一個內部文件。最大支持的標準似乎是-std=c++0x,並編譯標誌是這樣的文件:

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

在我安裝的根就在/opt/energia。在該文件中,我修改了行32compiler.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]

只要你離開捕獲空,你放心有一個「轉換」函數指針,因此,你可以將它存儲沒有問題。我寫的代碼:

  • 需要第一模板RET即返回類型
  • 需要第二個模板ARG是回調一個參數。在大多數情況下,您可能會考慮使用void*作爲常見參數(在void指針中轉換結構指針並將其用作參數,以在該函數中進行反轉換操作,操作不需要任何費用)
  • 實現兩個構造函數:空構造函數將函數指針初始化爲NULL,而第二個直接分配回調。注意拷貝構造函數丟失,你需要實現它。
  • 實現了調用函數的方法(重載運算符())並檢查回調是否實際存在。

還是那句話:這個東西有沒有警告編譯,但我不知道,如果它的MSP430,因爲我無法測試它(它的工作原理常見的AMD64 Linux系統上)。

+0

哈我最終弄清楚了關於'-std = C++ 0x'的部分,但是沒有機會在你之前發佈一個答案。我實際上碰到了一種情況,我可以將lambda存儲爲類成員,從中受益匪淺。我怎麼能沒有std :: function(因爲沒有stl可用)? – Alexander

+0

也許模仿你自己的類的'std :: function'? (查看答案) –