2016-12-05 5 views
4

でC++ 17ラムダ継承をコンパイルできるコンパイラusing function declarationについて読んで、最後の例をコンパイルしたかったのです。これは:パラメータパック

#include <iostream> 
template <typename... Ts> 
struct Overloader : Ts... { 
    using Ts::operator()...; // exposes operator() from every base 
}; 

template <typename... T> 
constexpr auto make_overloader(T&&... t) { 
    return Overloader<T...>{std::forward<T>(t)...}; 
} 

int main() { 
    auto o = make_overloader([] (auto const& a) {std::cout << a;}, 
          [] (float f) {std::cout << 13 << f;}); 
} 

私はすでにそれが何をするかを知っていても、それをコンパイルしてテストしたいと思います。 しかし、clang-4.0とg ++ - 7.0のどちらも現時点ではコンパイルできないようです。私はそれを試すことができる任意のコンパイラを持つ場所はありますか?

+3

GCCとClangの両方の最新バージョンで何かできない場合は、他のコンパイラでも(モジュロバグ)できることはほとんどありません。独立したプロジェクトでなければ、おそらくそのうちの1つのフォークです。 –

+1

この機能は、1か月前の作業草案に投票されました。実装には時間がかかります。 –

+0

@TC:宣言子リストの機能が承認されてもOPの例がどのようにコンパイルされるのかまだ分かりません。 'Overloader'は基本クラスを持っているため集約ではありません。また、 'make_overloader'はジェネリックラムダを受け取ります。したがって、' Overloader'はそれを扱うために適切にテンプレート化されていますか?あなたは私を助けることができます? – AndyG

答えて

2

P0195を可能にする提案言語拡張:

template <typename... Ts> 
struct Overloader : Ts... { 
    using Ts::operator()...; // <== ill-formed without p0195 
}; 

のみ(2016年11月)数週間前イサクアにC++に受け入れられました。 gccやclangがまだ実装していないのは驚くべきことではありません。彼らに時間を与えなさい。

代わりにの線形階層を作成してください。

+0

P0195の採用状況はどこで分かりましたか? [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/](http://www.open-std.org/jtc1)で「採用された」とマークされていません/ sc22/wg21/documents/papers/2016 /) –

+1

@VittorioRomeo私は[Botond](https://botondballo.wordpress.com/2016/11/25/trip-report-c-standards-meeting-in-issaquah)を信頼しています。 -november-2016 /) – Barry

+1

リニア?スラッカー。バイナリ! – Yakk

関連する問題