2016-08-04 6 views
2

::std::remove_cv<>は関数型では動作しないことを、私はconstvolatile過負荷を気にすることなく、メンバ関数の戻り値と引数の型を抽出しようとしているが、それは私には思える:should :: std :: remove_cv <>は関数型で動作しますか?

あり
template <typename> 
struct signature 
{ 
}; 

template <typename R, typename ...A> 
struct signature<R(A...)> 
{ 
}; 

template <typename C, typename F> 
constexpr auto extract_function_type(F C::* const) noexcept 
{ 
    return signature<::std::remove_cv_t<F>>(); 
} 

template <typename F> 
constexpr auto extract_signature(F const&) noexcept -> 
    decltype(&F::operator(), extract_function_type(&F::operator())) 
{ 
    return extract_function_type(&F::operator()); 
} 

答えて

2

[dcl.fct]/6:

関数宣言におけるCV-修飾子-配列の効果ADDIと同じではないconst関数型のようなものではありません関数型の先頭に のcv-qualificationがあります。後者の場合、cv修飾子は無視されます。 [注意: のcv-qualifier-seqを持つ関数型は、cv修飾型ではありません。 cv修飾された関数型はありません。末端ノート]

あなたがあなた自身の型特性を記述する必要があります

template<typename T> 
struct remove_cv_seq; 

template<typename R, typename... Args> 
struct remove_cv_seq<R (Args...) const> { 
    using type = R (Args...); 
}; 

template<typename R, typename... Args> 
struct remove_cv_seq<R (Args...)> { 
    using type = R (Args...); 
}; 

struct Foo { 
    remove_cv_seq<void() const>::type bar; 
}; 

int main() 
{ 
    Foo const x; 
    x.bar(); // This will fail to compile because it tries to call non-const member function. 
} 
+0

ああ、私はそんなに、どのようにREF-修飾された関数の種類については、私はあまりにもそれらを削除する必要があります考え出しましたか? – user1095108

+0

@ user1095108ええ。ボイラープレートがたくさんあります。私は最低限しか掲示しなかった。 – Simple

+0

Ok、ok、ボイラープレートのないより洗練されたソリューションが存在する場合は、答えに追加してください。 – user1095108

関連する問題