3
struct foo { 
    void bar(int&&) && { } 
}; 

template<class T> 
using bar_t = void (std::decay_t<T>::*)(int&&) /* add && if T is an rvalue reference */; 

int main() 
{ 
    using other_t = void (foo::*)(int&&) &&; 
    static_assert(std::is_same<bar_t<foo&&>, other_t>::value, "not the same"); 

    return 0; 
} 

我想要的typedef一個指向CV-和/或ref-合格成員函數

  • bar_t<T>產量void (foo::*)(int&&)如果T = foo
  • bar_t<T>產量void (foo::*)(int&&) const如果T = foo const
  • bar_t<T>收率void (foo::*)(int&&) &如果T = foo&
  • bar_t<T>產生void (foo::*)(int&&) const&如果T = foo const&

等。我怎樣才能做到這一點?

+0

這是什麼用途? –

+0

以與完美轉發的方式分配左值/右值相同的方式分配CV限定符。一般來說,假設CV和LR不變,但提供它是非常有價值的,特別是如果它是一個可以定義爲特徵的屬性。您不必爲每個變體編寫單獨的邏輯 - 因此「不變」 - 您將能夠對這些變體的組合進行歸納推理。 –

回答

2

這應該做的工作:

template <typename, typename T> struct add {using type = T;}; 
template <typename F, typename C, typename R, typename... Args> 
struct add<F const, R (C::*)(Args...)> {using type = R (C::*)(Args...) const;}; 

template <typename F, typename C, typename R, typename... Args> 
struct add<F&, R (C::*)(Args...)> : 
    std::conditional<std::is_const<F>{}, R (C::*)(Args...) const&, 
             R (C::*)(Args...) &> {}; 
template <typename F, typename C, typename R, typename... Args> 
struct add<F&&, R (C::*)(Args...)> : 
    std::conditional<std::is_const<F>{}, R (C::*)(Args...) const&&, 
             R (C::*)(Args...) &&> {}; 

Demo。請注意,F的基礎類型將被忽略。

+0

...需要...更多...部分...專業化...;) –

+2

@ T.C。 「應該」。我不是在晚上11點報道可變成員函數的指針。 ;) – Columbo

+0

http://en.cppreference.com/w/cpp/types/is_function>'可能的實施'顯示這可能會有多醜。另一方面,限定符和被限定的主題是正交的,相應的'std :: add_const'可以自動執行手動完成的工作。這可能是值得我們面對未來的C++ 23的「16777215規則」。 :) –

相關問題