2016-04-08 10 views
2

メタプログラミングで使用するSTL機能ライブラリおよび他のライブラリと同等のconstexprまたは他のコンパイル時間はありますか?具体的には、SFINAEを使用していくつかの条件を評価し、対応するタイプを生成するメタプログラムを作成しようとしています。例:メタプログラミングのためのC++ STL機能的同等物

template<int A, int B> 
enable_if_t<(A < B)> my_func() {// do something 
} 

template<int A, int B> 
enable_if_t<!(A < B)> my_func() {// do nothing 
} 

理想的には、私は、ユーザーがかなり硬い<に符号化よりも、コンパレータ(等std::less<int>)に通過できるようにしたいです。だから、のようなもの:機能オブジェクトは定数式ではないので

template<int A, int B, class comp = std::less<int>> 
enable_if_t<comp(A, B)> my_func() {// do something 
} 

template<int A, int B, class comp = std::less<int>> 
enable_if_t<comp(A, B)> my_func() {// do nothing 
} 

はしかし、彼らはコンパイル時に評価取得されていないので、これは動作しません。このようなものを実装する正しい方法は何でしょうか?

+3

'enable_if_t '? – cpplearner

+0

それは動作しません。コンパイラは文句を言う:non-type template 引数は定数式ではない –

+0

'enable_if_t'は[C++ 14](http://en.cppreference.com/w/cpp/types/enable_if)でのみ定義されています。どのようにそれがC++ 11で動作すると思いますか?あなたはそれを自分で定義しましたか? –

答えて

6

std::less<int>(int, int)std::lessのコンストラクタではありません。 std::lessの唯一のコンストラクタは()です(これは明らかに私が何かを作っているので、{}を使うことを好む)。

C++ 14以降では、コンパイル時に評価することができるconstexproperator()(関連するタイプの<がある場合)が評価されます。したがって

template<int A, int B, class comp = std::less<int>> 
enable_if_t<comp{}(A, B)> my_func() {// do something 
} 

template<int A, int B, class comp = std::less<int>> 
enable_if_t<!comp{}(A, B)> my_func() {// do nothing 
} 

が動作するはずです。 C++ 11

namespace notstd { 
    template<class T=void> 
    struct less { 
    constexpr bool operator()(T const& lhs, T const& rhs)const{ 
     return lhs<rhs; 
    } 
    }; 
    template<> 
    struct less<void> { 
    template<class T, class U> 
    constexpr bool operator()(T const& lhs, U const& rhs)const{ 
     return lhs<rhs; 
    } 
    // maybe also add this: 
    //struct is_transparent {}; 
    } 
} 

(システム上の<と仮定すると、ポインタ上の全順序である)(notstd::less<T>std::less<T>を交換する)動作するはずです。

+0

申し訳ありません、元の質問を更新しましたが、私はまだC++ 11でなければなりません。 –

+0

もしあなたがC++ 11に固執しているのであれば、あなた自身の 'constexpr'比較関数/ functors/whatever ...-)を定義することができます: – jotik

+0

後者はネゲートされるべきです、'!comp {}(A、B ) ' –

関連する問題