2012-03-24 33 views
6

我有以下功能:返回類型很長的表達

inline auto iterateSomething(obj & o) 
{ 
    auto iterators = baseIterator(o); 
    auto tranformer = boost::bind(transofrmToSomething, _1, o); 
    typedef boost::transform_iterator<decltype(tranformer), decltype(iterators.first)> iterator_t; 
    iterator_t begin(iterators.first, tranformer); 
    iterator_t end(iterators.second, tranformer); 
    return std::make_pair(begin, end); 
} 

正如你所看到的,我不知道返回值,即使我把INT那裏,後來從錯誤消息複製型,它是一個非常長的類型...
有沒有一種方法來指定返回類型作爲函數中唯一返回的類型?是否有任何解決方法不涉及返回類型中的巨大類型?

+0

typedefs是你的朋友,你也可以定義一個元函數來計算返回類型。 – enobayram 2012-03-24 11:25:09

+7

您可以在功能外移動typedefs。然後你可以用它來聲明返回類型。 – 2012-03-24 11:27:46

回答

2

,我認爲你應該做的雷蒙德陳在評論所說:

移動功能之外的typedef。然後你可以用它來聲明返回類型。

如果雷蒙德其發佈應優先接受我的答案 - 我張貼這使位掩碼的答案是不是唯一的一個,因爲我認爲這是一個治療比疾病本身更糟糕。

0

如果你不想讓你的typedef搬走,那麼如何呢?

auto getIt = [] (obj& o, bool getEnd) { 
    return boost::transform_iterator< 
      decltype(boost::bind(transofrmToSomething, _1, o)), 
      decltype(baseIterator(o).first) 
     >(
      getEnd ? baseIterator(o).second : baseIterator(o).first, 
      boost::bind(transofrmToSomething, _1, o) 
     ); 
} 

auto iterateSomething = [] (obj & o) { 
    return std::make_pair(getIt(o,false), getIt(o,true)); 
} 
+0

iterateSomething的參數不應該在[]之後出現嗎? – 2012-03-24 15:10:59

+0

@VaughnCato:很好,趕快,謝謝!我從一個函數中改變它,忘記移動參數列表。改變。 – bitmask 2012-03-24 15:12:27

+0

這是一個C++雷區:一個三元運算符,magic _1(兩次!),一個作爲數字給出的布爾參數,還用作選擇器,一個名爲o的變量,緊鄰_1,decltype(兩次!),auto !),lambda表達式(兩次!),我仍然不確定是否完全可以在「first」而不是「second」上使用decltype。幾乎沒有什麼功能在這裏展示,現在它是完全不可逾越的。做Raymond Chen所說的 - 未來的維護者會感謝你。 – 2012-03-24 19:37:39

相關問題