2014-12-29 83 views
0

我有一個T類型的成員函數fn,返回類型RT。 我有一個模板,需要TRT作爲參數。我想要別名這個模板類,這樣我的代碼就不會很難看,也很難閱讀。我將如何實現這一目標?我如何別名模板專業化?

template <typename X, typename Y> 
struct I 
{}; 

struct T 
{ 
    int& fn(int); 
}; 

所以我想這個別名或像這種類型的,所以我可以寫這樣的功能:

template <typename C> 
I< typename std::remove_reference<std::decltype(std::declval(C).fn(0))>::type, C> fn(C& c) 
{ 
    return I< typename std::remove_reference<std::decltype(std::declval(C).fn(0))>::type, C>(); 
} 

但較少的混亂。我之前沒有使用過std::decltype,所以我甚至不確定我是否正確地使用它,因爲我收到錯誤。

我正在考慮使用類似這樣的函數並對它進行decltype,但我遇到了一些困難,我希望它看起來更乾淨。

+0

[像這樣的?](http://coliru.stacked-crooked.com/a/7fbad782592aa57b) –

+0

肯定的。發佈它作爲答案,我會將其標記爲已回答。 – Adrian

+0

哦,等一下。實例化時它不起作用。 [見這裏](http://coliru.stacked-crooked.com/a/3efd2d12eeaeff1f)。 – Adrian

回答

1

decltype()是一個內置的運算符,而不是來自std命名空間的函數,如std::declval<T>()

如果你想縮短與別名模板語法,可以如下所示聲明一個:

#include <type_traits>  

template <typename C> 
using IT = I<C, typename std::remove_reference<decltype(std::declval<C&>().fn(0))>::type>; 

template <typename C> 
IT<C> fn(C& c) 
{ 
    return IT<C>(&c, c.fn(1)); 
} 

DEMO


由於上面的代碼無法在VC成功編譯++爲一個未知的原因,你可以改爲創建一個別名模板來查詢你已有的幫助函數的結果類型:

template <typename C> 
I<C, typename std::remove_reference<decltype(std::declval<C&>().fn(0))>::type> test(); 

template <typename C> 
using IT = decltype(test<C>()); 

template <typename C> 
IT<C> fn(C& c) 
{ 
    return IT<C>(&c, c.fn(1)); 
} 

DEMO 2

+0

哦,等等。實例化時它不起作用。 [見這裏](http://coliru.stacked-crooked.com/a/3efd2d12eeaeff1f)。 – Adrian

+0

@Adrian查看關於VC++的更新 –