2016-12-23 40 views
2

有沒有辦法可以做到這一點?據我所知還沒有,因爲語言不支持,但我想確認將模型參數返回類型扣除

template <typename Something> 
ConceptCheck<auto> return_something(const Something& something) { 
    return process_something(something); 
} 

這將是不錯的在某些情況下。例如,如果想要記錄返回類型支持的概念(否則這將是一個簡單的自動操作,要求讀者去其他地方尋找信息)。

如果這似乎是一個體面的事情提出,我想提出這個標準的未來,有人可以指導我如何做到這一點? C++ 20標準中是否有返回類型概念?

謝謝!

+0

這是你在找什麼? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0238r0.html –

回答

2

你可以找到幾乎你可能想知道的關於正在進行的標準化努​​力在https://isocpp.org/

什麼特別,https://isocpp.org/blog/2016/12/2016-11-post-issaquah-mailing-available列出了所有在最近的郵件的文件,用文字C的當前草案+ +17。

我可以告訴你,概念有而不是此時已被納入標準草案。不過,這可能會在下次會議中發生變化。

+0

對不起!我的意思是C++ 20,我會更新我的問題 – Curious

+1

@Curious我不認爲任何人都知道C++ 20將包含在這一點上,因爲C++ 17不是最終的。 –

+0

謝謝!我提出了你的答案,但我仍然會等待解決問題其他部分的答案。 – Curious

1

您可以使用函數聲明和尾隨返回類型來做到這一點。
它遵循最小,工作示例(C++ 14):

#include<type_traits> 

template<typename> 
struct ConceptCheck {}; 

template<typename T> 
T get_it(ConceptCheck<T>); 

ConceptCheck<char> process_something(int) { return {}; } 
ConceptCheck<void> process_something(double) { return {}; } 

template <typename Something> 
auto return_something(const Something& something) 
-> ConceptCheck<decltype(get_it(process_something(something)))> { 
    return process_something(something); 
} 

int main() { 
    static_assert(std::is_same<decltype(return_something(0)), ConceptCheck<char>>::value, "!"); 
    static_assert(std::is_same<decltype(return_something(0.)), ConceptCheck<void>>::value, "!"); 
} 

好吧,我承認ConceptCheck<auto>會更好比:

ConceptCheck<decltype(get_it(process_something(something)))> 

無論如何,如果我們的目標是,以記錄返回類型ConceptCheck,無論實際的模板參數是什麼,這是一個可行的解決方案。

如果你不喜歡後返回類型或者它不是由你的文檔工具的支持,你仍然可以使用std::declval,因爲它遵循你不能將其記錄下來:

template <typename Something> 
ConceptCheck<decltype(get_it(process_something(std::declval<Something>())))> 
return_something(const Something& something) { 
    return process_something(something); 
} 

甚至更​​好:

template <typename Something, typename T = decltype(get_it(process_something(std::declval<Something>())))> 
ConceptCheck<T> 
return_something(const Something& something) { 
    return process_something(something); 
} 

額外的模板參數是很醜陋,但返回類型是最後ConceptCheck<T>

相關問題