2017-08-02 12 views
2

ラムダまたはフリー関数がC++ 14メタプログラミングを使用してconstであるかどうかを調べようとしています。関数がconstであるかどうかを調べる

私の現在の戦略は、各引数にstd::is_reference,std::is_pointerおよびstd::is_constを使用することです。 (現在、グローバル変数を無視して...)

だからチェックするタイプのオブジェクトは、次のようになります...私はvalueを実装する方法を知りたい

template <typename F> 
struct is_const_func: public function_traits<decltype(&F::operator())> {}; 

template <typename ClassType, typename ReturnType, typename... Args> 
struct is_const_func<ReturnType (ClassType::*)(Args...)> { 
    static const std::tuple<std::is_reference<Args>...> ref; 
    static const std::tuple<std::is_pointer<Args>...> ptr; 
    static const std::tuple<std::is_const<Args>...> con; 
    static const bool value = ? // Reduce(&&, (!ref && !ptr) || con) 
} 

。基本的には、各タプルからi番目の要素を取り出し、(!ref[i] && !ptr[i]) || con[I]を計算し、得られたタプルを&&でコンパイル時にすべて削減したいと考えています。

どうすれば実装できますか?このチェックを行うより良い方法はありますか?

+4

フリー関数がconstであることはどういう意味ですか? – Barry

+0

この場合、引数として渡されたすべてのポインタと参照が 'const'修飾されているかどうかを調べています。これは、関数がプログラムの状態を変更しないのに十分ではありませんが、関数内でグローバル変数がアクセス/変更されていないと仮定しています。 – subzero

+2

あなたはそのような特性で何をしますか?グローバルな状態に加えて、 'T const *'に渡されたものはまだ変更可能な '変更可能なメンバ 'を持つことができます。 – Barry

答えて

2

最初にC++の実装が見つかりました。17 std apply。

all_ofconstexprテンプレート関数として書き込みます。

次に、書き込み

struct all_of_t{ 
    constexpr all_of_t(){} 
    template<class...Bs> 
    constexpr bool operator()(Bs...bs)const{ return all_of(bs...); } 
}; 

最後:

static const std::tuple<std::integral_constant<bool, 
    (!std::is_reference<Args>{}&&!std::is_pointer<Args>{})||std::is_const<Args>{}>... 
> arg_state; 
static const bool value = apply(all_of_t, arg_state); 

各ステップは、SOでの検索が容易であるべきです。

+0

'constexpr'関数として' all_of'を書くのではなく、 'template constexpr bool all_of_v = Bs && ...;'をC++ 17で、テンプレート ' constexpr bool all_of_v = std :: is_same 、bool > :: value; '' bool'は 'テンプレートのような型です struct bools {}; ' – Justin

+1

@justin私はそれらの整数定数を自分自身ではなく定数にします – Yakk

関連する問題