2017-11-18 78 views
0

比方說,我有這樣的在模板參數避免自動列出

template <auto Arg> class X; 

類模板,但因爲我在模板參數列表使用MSVC 2017.5,auto不支持,我必須寫

template <typename T, T Arg> class X; 

並通過X<int, 5>明確指定類型,而不是使用自動扣除。現在,有沒有辦法在模板參數列表中找到沒有auto的相同結果?


具體而言,我有以下問題。

template <typename C, typename T> 
using Func = const T& (C::*)(void) const; 

template <typename C, typename T, Func<C, T> F> 
class X; 

而且我可以用X這樣的:

class Y { const int &getInt() const; } 

X<Y, int, &Y::getInt> x; 

我當然希望避免Yint如果可能的明確命名。

+0

正在使用自動解決方案中的一個選項來解決實際問題,或者您是否真的想要避免自動?我不清楚,如果你只用它作爲例子。 – nyronium

回答

4

你只有一個追索前C++ 17,它不漂亮或推薦。您必須轉向預處理器。只有它可以「自動提取類型」。

#include <iostream> 

template <typename C, typename T> 
using Func = const T& (C::*)(void) const; 

template<typename PMem, PMem f> class X; 

template <typename C, typename T, Func<C, T> F> 
class X<Func<C, T>, F> {}; 

#define MAKE_X(...) X<decltype(__VA_ARGS__), __VA_ARGS__> 

struct Y { const int &getInt() const; }; 


int main() { 
    MAKE_X(&Y::getInt) x; 
    return 0; 
} 

關鍵部分是MAKE_X。它會發出你給它的相同標記,作爲參數decltype並且不變。這是一種自動提取表達式類型的方法。

毋庸置疑,它沒有接近和適當的auto參數。

+0

謝謝!令我驚訝的是,沒有像定義一個函數模板'template constexpr C helper((C :: *)(const T&))'的'hacky'方法,然後通過'std提取返回類型:: result_of'。但我不知道是否可以將'helper'的函數參數指定爲編譯時間常量,並希望這有助於評估返回類型。 –

+0

@ M.Winter - 你可以這樣寫。但是,您仍然需要使用decltype來將函數調用表達式轉換爲類型。它可能會導致您以任何方式使用宏,以減少冗長。 – StoryTeller