2011-12-15 73 views
2

我有麻煩走樣功能boost::make_iterator_range是否可以別名boost :: make_iterator_range?

(我想隱藏的情況下,這個特殊的相片庫會在未來採取到標準某個別名背後的推動作用。)

有什麼辦法這個可以被開發工作?

#include <boost/range/iterator_range.hpp> 

void Foo() 
{ 
} 

template< typename T > 
void Bar() 
{ } 

template< typename T > 
void Bar(char c) 
{ } 

void (&FooAlias)() = Foo;   // ok 
void (&BarAlias)() = Bar<int>;  // ok 

// boost::iterator_range<const size_t*> (&MakeIterRangeAlias)(const size_t*,const size_t*) = 
// boost::make_iterator_range<const size_t*>; // not ok 

int main(int argc, char** argv) 
{ 
    const size_t v[] = { 3, 5, 1, 5, 29, 15 }; 

    boost::iterator_range<const size_t*> r 
     = boost::make_iterator_range(std::begin(v), std::end(v)); // want to alias this 

    return 0; 
} 

的錯誤信息是:

In file included from /usr/include/boost/iterator/iterator_categories.hpp:15:0, 
       from /usr/include/boost/iterator/detail/facade_iterator_category.hpp:7, 
       from /usr/include/boost/iterator/iterator_facade.hpp:14, 
       from /usr/include/boost/range/iterator_range_core.hpp:23, 
       from /usr/include/boost/range/iterator_range.hpp:13, 
       from sandbox.cpp:2: 
/usr/include/boost/mpl/eval_if.hpp: In instantiation of ‘boost::mpl::eval_if_c<true, boost::range_const_iterator<const long unsigned int*>, boost::range_mutable_iterator<const long unsigned int* const> >’: 
/usr/include/boost/range/iterator.hpp:63:63: instantiated from ‘boost::range_iterator<const long unsigned int* const>’ 
sandbox.cpp:20:10: instantiated from here 
/usr/include/boost/mpl/eval_if.hpp:60:31: error: no type named ‘type’ in ‘boost::mpl::eval_if_c<true, boost::range_const_iterator<const long unsigned int*>, boost::range_mutable_iterator<const long unsigned int* const> >::f_ {aka struct boost::range_const_iterator<const long unsigned int*>}’ 
/usr/include/boost/mpl/eval_if.hpp: In instantiation of ‘boost::mpl::eval_if_c<false, boost::range_const_iterator<const long unsigned int*>, boost::range_mutable_iterator<const long unsigned int*> >’: 
/usr/include/boost/range/iterator.hpp:63:63: instantiated from ‘boost::range_iterator<const long unsigned int*>’ 
sandbox.cpp:20:10: instantiated from here 
/usr/include/boost/mpl/eval_if.hpp:60:31: error: no type named ‘type’ in ‘boost::mpl::eval_if_c<false, boost::range_const_iterator<const long unsigned int*>, boost::range_mutable_iterator<const long unsigned int*> >::f_ {aka struct boost::range_mutable_iterator<const long unsigned int*>}’ 
sandbox.cpp:20:10: error: invalid initialization of non-const reference of type ‘void (&)(const size_t*, const size_t*) {aka void (&)(const long unsigned int*, const long unsigned int*)}’ from an rvalue of type ‘<unresolved overloaded function type>’ 
make: *** [sandbox] Error 1 
+2

我看到的第一個問題是別名的返回類型是錯誤的(它應該是`boost :: iterator_range `,而不是`void`)。 – Mankarse 2011-12-15 06:03:35

+1

`make_iterator_range`的第二個參數應該是`&v [n]`。它應該指向最後一個元素之後的元素。因爲你已經標記了[C++ 11],所以使用`std :: begin`和[`std :: end`](http://en.cppreference.com/w/cpp/iterator/end)來避免必須計算`n`。 – kennytm 2011-12-15 06:10:42

回答

5

使用函數指針是次優的方式別名的功能。它不像原來的那麼靈活(它不能再是一個模板),你現在需要知道函數的確切簽名,它可能會或可能不穩定。
請嘗試這種方法。

template< typename ... Args > 
auto MakeIterRangeAlias(Args&& ... args) -> decltype(/* copy return line here */) 
{ 
    return boost::make_iterator_range(std::forward<Args>(args)...); 
} 

由於您幾乎沒有任何工作,別名支持原始的確切簽名。即使它發生了巨大的變化,你仍然設置。此外,與函數指針方法不同的是,優化器將能夠輕鬆地內聯MakeIterRangeAlias,從而不存在運行時開銷。