2012-09-26 35 views
5

這應該是微不足道的實施,像是否有隻返回其參數的std函數?

template<typename T> 
T & as_is(T & t) { return t; } 

不過,我想不會有寫它(:

我沒有找到這樣的事情上www.cplusplus.com

。對於那些會問「你想做什麼」的人來說,這裏有一些東西,我有一個建立ascii表的類,它有很好的填充和一切,我會留下細節,重要的是它存儲字符串所以它可以計算出多少)我想實現一個排序函數並能夠告訴類t o將該列用作特定類型。如果我想通過一列整數(這又是內部字符串)排序,我會通過atoi。如果對字符串進行排序,我想通過as_is或stl等效(如果有的話)。

+4

也許'std :: forward '滿足這些要求? –

+1

@Kerrek:這是一個很好的例子,但它需要你拼出模板參數。 – Xeo

回答

2

您不能像傳遞函數那樣傳遞模板,所以std :: forward和您的假設的nonstd :: identity函數都不會按原樣工作(因爲它是)。你需要明確設定的目標類型的變換:

table.SortColumnUsing(3, nonstd::identity<std::string>); 

這似乎有點難看給我,因爲模板特殊化類型是內部實現表的功能,而不是什麼與我期待表格序列化爲類型的類型相關。或者,也許你並沒有真正將這些列存儲爲std :: string。

atoi如何作爲類型描述符工作? atoi期望char *,而不是std :: string,我不認爲你可以將int(const char*)隱式轉換爲int(const std::string&)。即使你能做到這一點,你使用哪種類型,可以存儲int(const std::string&)Banana(const std string&)。也許我不完全理解你的問題的上下文,或者你有一些C++技巧,我很樂意學習。

我的傾向是傳遞比較函數而不是轉換函數。這將導致一個單一的常量函數類型,可能是bool(const std::string&, const std::string&)。這也可能使實現更簡單,例如。不區分大小寫或特定於語言環境的字符串比較,或其他UI方便的排序黑客行爲(如將文件夾放在列表頂部:首先檢查是否只有一個字符串具有尾部/,否則使用標準比較。)但這並不能真正解決專業化問題;對於std::string的情況下,你仍然以std::less<std::string>(至少存在)結束。

不是一個好的答案,我知道......但它太長了評論。

+1

這是一個很好的答案,因爲它追求的是事業,而不是問題。傳遞轉換函數以「整數排序」排序聽起來很糟糕,所以+1建議使用比較函數。 – Xeo

+0

我實際上將一個比較函數傳遞給當前的排序函數。由於構造的冗長,我想(編輯)擺脫它。也就是說,我忘記了我仍然需要'.c_str()'函子的atoi'中的字符串,這會阻止將它按原樣傳遞給sort函數,從而打破了這個例子。 – Gabriel

3

爲什麼不重載函數並且不傳遞任何東西?

順便說一句,如果你正在使用MSVC,他們有identity類模板,它有一個重載的operator()返回輸入。所以從理論上講,你可以通過std::identity<std::string>(),但我會說,只是建立你自己的identity函數。

+0

有趣。它看起來像身份不是特定於MS:http://www.sgi.com/tech/stl/identity.html http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.5/a00497.html – Gabriel

+0

重載意味着複製一些代碼。爲了避免重複,沒有參數的重載會使用參數調用版本,從而給出身份。這將提供便利的方法,增加了複雜性而不增加任何功能。 – Gabriel

+2

@Gabriel它是在一個最新的標準草案,但被放棄。你不會在GCC 4.6上找到它。 –

相關問題