2017-10-18 45 views

答えて

1

このトピックについては、TIのサイトであまり詳しく述べていませんが、少なくとも、詳細で正確な回答を得るには十分なC++についてはわかりません。

埋込み型ABIの実装は、主にItanium C++ ABIの派生であるthis documentに記述されています。ラムダの実装や、autoのキーワードについては何も説明していません(または、おそらく私はドキュメントからこの情報を引き出すことができません)。

こうして私は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() { }  

を(テンプレートはヘッダのみであれば動作します、メインスケッチではエラーが発生します)。このスケッチをコンパイルするために、私はエディタの1つの内部ファイルを修正しなければなりませんでした。サポートされる最大標準は、-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]

キャプチャを空のままにすると、関数ポインタへの「変換」が確実に行われるため、問題なく格納できます。私が書いたコード:

  • が返される型
  • は、コールバックのための1つの引数である第二のテンプレートARGを必要としている最初のテンプレートRETが必要です。大部分の場合、一般的な引数としてvoid*を使用することを検討することができます(voidポインターで構造体ポインタをキャストし、それを引数として使用して関数内でカウンタキャストすると、操作のコストはかかりません)
  • は2つのコンストラクタを実装します。空のコンストラクタはファンクションポインタをNULLに初期化し、2番目のコールバックはコールバックを直接割り当てます。コピーコンストラクタがないことに注意してください。それを実装する必要があります。
  • は、ファンクションを呼び出すメソッド(オペレータをオーバーロードする())を実装し、コールバックが実際に存在するかどうかをチェックします。
  • 再び

このようなものは警告なしでコンパイルが、それはMSP430上で動作するかどうか、私はそれをテストすることはできませんので、私は(それが共通のAMD64 Linuxシステム上で動作)、知りません。

+0

私は '-std = C++ 0x'に関する部分を見つけ出しましたが、あなたの前に答えを投稿する機会はありませんでした。私は実際にクラスメンバーとしてラムダを保存できることから大きな利益を受ける状況に遭遇しました。どうすればstd :: function(stlが使えないので)をせずにこれを行うことができますか? – Alexander

+0

自分のクラスで 'std :: function'を模倣しているかもしれませんか? (答えを見てください) –

関連する問題