【发布时间】:2011-05-19 23:05:50
【问题描述】:
我有一个几乎可行的解决方案。但是,它无法编译一些简单的案例,并且我无法破译错误消息。
我目前的解决方案:
#define AUTO_RETURN( EXPR ) -> decltype( EXPR ) \
{ return EXPR; }
template< typename BinaryFunc, typename First, typename Second >
auto foldl( BinaryFunc&& func, First&& first, Second&& second )
AUTO_RETURN( func( std::forward<First>(first), std::forward<Second>(second) ) )
template<typename BinaryFunc, typename First, typename Second, typename... Rest >
auto foldl( BinaryFunc&& func, First&& first, Second&& second, Rest&&... rest )
AUTO_RETURN(
foldl(
std::forward<BinaryFunc>(func),
func( std::forward<First>(first), std::forward<Second>(second) ),
std::forward<Rest>(rest)... )
)
struct adder
{
template< int LHS, int RHS >
std::integral_constant<int,LHS+RHS>
operator()( std::integral_constant<int,LHS>, std::integral_constant<int,RHS> )
{
return {};
}
};
auto result = foldl( adder(),
std::integral_constant<int,19>{},
std::integral_constant<int,23>{}
);
assert( result.value == 42 );
不过这个fails to compile。
foldl( adder(),
std::integral_constant<int,1>{},
std::integral_constant<int,2>{},
std::integral_constant<int,3>{},
std::integral_constant<int,4>{},
);
奇怪的是,如果我从代码中删除所有 std::forward 和右值引用,则它是 works fine。
我做错了什么?
这是编译器错误吗?
【问题讨论】:
-
您在 ideone 的一些代码丢失了
#include <cassert>。 -
我认为只有
std::forward<Rest>(rest)...失败了,其余的看起来都很好。 -
@ildjarn,为什么
std::forward<Rest>(rest)...会失败? -
这让我想起了stackoverflow.com/questions/3744400/… 这可能是同一个问题
标签: c++ templates c++11 variadic-templates