2016-09-27 91 views
8

隨着non-type template arguments with auto即將到來的C++ 17的功能,纔有可能以這樣的方式來實現std::function爲能放,例如,下面的功能:具有自動功能的C++ 17模板參數是否允許約束std :: function對象?

bool f(int n, double d) {}  
    bool g(bool b, char c) {} 
    bool h(bool b)   {} 

進入自動模板std::function物體:

std::function<bool(auto, auto)> faa = f; // ok 
    std::function<bool(int, auto)> fia = f; // ok 
    std::function<bool(double, auto)> fda = f; // error: function type mismatch 
    std::function<bool(auto, auto)> gaa = g; // ok 
    std::function<bool(auto, auto)> haa = h; // error: function type mismatch 
    std::function<bool(auto)>   ha = h; // ok 

等等。

換句話說,有std::function對象約束功能類型,他們接受

(目前,海合會我們得到了error: 'auto' parameter not permitted in this context

+0

假如存在這樣的事情,你會如何調用'std :: function '? –

+0

@ n.m .:非常非常小心。 –

+0

@LightnessRacesinOrbit,而不是通常馬虎的預先C++ 17函數的調用? –

回答

7

那些不是非類型模板參數,所以auto在C++ 17不允許存在。

非類型模板參數是指向模板的參數,模板是指針或整數或類似的實際值而非類型。

有關示例,

std::integral_constant<std::size_t, 7>; 

這裏7std::size_t是類型和值7的非類型模板參數。

非類型模板auto許可證是這樣的:

template<auto x> 
using integral = std::integral_constant< decltype(x), x >; 

現在integral<7>std::integral_constant<int, 7>

另一方面,您使用auto代替類型,而不是非類型。


還有一種情況的模板類型推導出一個特徵,所以你可以寫:

std::function faa = f; 

如果他們增強std::function能夠推斷出一個函數指針的簽名(或不模板可調用)。

但請注意,此std::function將具有固定的簽名,而不是模板簽名。該功能只允許扣除,而不是模板動態分派。

我不知道std::function在C++ 17中是以這種方式增強的,但添加了這樣做的語言功能。

+0

*「模板動態調度」*哦,上帝......我希望這件事永遠不會存在 –

+0

@GuillaumeRacicot只需發佈一個編譯器,一個源代碼的抽象,並要求調用者爲傳入的模板參數提供相同的內容。編譯它並在調度過程中記憶編譯。十分簡單!腳本/字節碼語言一直都在使用它(通常使用比C++模板更少的功能)。 – Yakk

相關問題