ラムダまたはフリー関数が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]
を計算し、得られたタプルを&&
でコンパイル時にすべて削減したいと考えています。
どうすれば実装できますか?このチェックを行うより良い方法はありますか?
フリー関数がconstであることはどういう意味ですか? – Barry
この場合、引数として渡されたすべてのポインタと参照が 'const'修飾されているかどうかを調べています。これは、関数がプログラムの状態を変更しないのに十分ではありませんが、関数内でグローバル変数がアクセス/変更されていないと仮定しています。 – subzero
あなたはそのような特性で何をしますか?グローバルな状態に加えて、 'T const *'に渡されたものはまだ変更可能な '変更可能なメンバ 'を持つことができます。 – Barry