2012-03-24 54 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

相关问题