这个 C++11 可变参数和函数的实现有什么问题(如果有的话)?
What's wrong (if anything) with this implementation of a C++11 variadic sum function?
可能重复:
使用带可变模板函数的decltype的尾随返回类型
我得到这个编译器错误:
g++ -std=gnu++0x -I. -O3 -Wall sum.cpp
sum.cpp:7:41: sorry, unimplemented: cannot expand ‘Remaining ...’ into a fixed-length argument list
sum.cpp: In function ‘int main(int, const char**)’:
sum.cpp:29:23: error: no matching function for call to ‘sum(int, int, int)’
sum.cpp:29:23: note: candidate is:
sum.cpp:20:6: note: template<class FirstArg, class ... RemainingArgs> decltype (Sum<FirstArg, RemainingArgs ...>::sum(first, sum::args ...)) sum(const FirstArg&, const RemainingArgs& ...)
对于这个sum.cpp:
#include <iostream>
#include <type_traits>
template <typename First, typename... Remaining>
struct Sum {
static auto sum(const First &arg, const Remaining &... args)
-> decltype(arg + Sum<Remaining...>::sum(args...))
{
return arg + sum(args...);
}
};
template <typename First>
struct Sum<First>
{
static First sum(const First &arg) { return arg; }
};
template <typename FirstArg, typename... RemainingArgs>
auto sum(const FirstArg &first, const RemainingArgs &... args)
-> decltype(Sum<FirstArg, RemainingArgs...>::sum(first, args...))
{
return Sum<FirstArg, RemainingArgs...>::sum(first, args...);
}
int main(int argc, const char *argv[])
{
using ::std::cout;
cout << sum(1, 2, 3) << 'n';
return 0;
}
我已经尝试了多种方法来声明这个函数。这只是gcc 4.6.1的问题吗?
编辑:这是我最终使用的内容,因为我并不真正信任::std::common_type
模板。不过,它仍然有一个问题,它将从右到左绑定+
,而不是从左到右。这可能会引起非交换+
算子的问题。不过,这并不难解决:
#include <iostream>
#include <type_traits>
#include <utility>
namespace {
template<class T> typename ::std::add_rvalue_reference<T>::type val();
template<class T> struct id{typedef T type;};
template<class T, class... P> struct sum_type;
template<class T> struct sum_type<T> : id< T > {};
template<class T, class U, class... P> struct sum_type<T,U,P...>
: sum_type< decltype( val<const T&>() + val<const U&>() ), P... > {};
}
template <typename T>
T sum(const T &&arg)
{
return ::std::forward<const T>(arg);
}
template <typename FirstArg, typename SecondArg, typename... RemainingArgs>
auto sum(const FirstArg &&first, const SecondArg &&second,
const RemainingArgs &&... args)
-> typename sum_type<FirstArg, SecondArg, RemainingArgs...>::type
{
using ::std::forward;
return forward<const FirstArg>(first) +
sum(forward<const SecondArg>(second),
forward<const RemainingArgs>(args)...);
}
int main(int argc, const char *argv[])
{
using ::std::cout;
cout << sum(1, 2, 3.2) << 'n';
return 0;
}
sum
函数具有错误的签名。
对于运行时可变函数,请尝试以下操作:
#include <type_traits>
#include <utility>
template <typename T> T sum(T && x) { return std::forward<T>(x); }
template <typename T, typename ...Args>
typename std::common_type<T, Args...>::type sum(T && x, Args &&... args)
{
return std::forward<T>(x) + sum(std::forward<Args>(args)...);
}
int main()
{
return sum(1,2,3,4);
}
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了