gpt4 book ai didi

c++ - 使用可变参数模板在 C++ 中实现分差

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:11 25 4
gpt4 key购买 nike

我正尝试在 C++ 中实现出现的除差公式 here .

到目前为止我已经有了这个

template<typename F, typename T>
T divdiff(F f, T t1, T t2) {
return (f(t1) - f(t2)) / (t1 - t2);
};

template<typename F, typename T, typename... Args>
T divdiff(F f, T tstart, Args... t, T tend) {

return (divdiff(f, tstart, t...) - divdiff(f, t..., tend))/ (tstart - tend);

};

它编译得很好,但是当它尝试像这样使用它时

 double r = divdiff([](double x) { return 2 * x; }, 1.0, 2.0, 3.0);

出现以下错误

note: candidate function not viable: requires 3 arguments, but 4 were provided
T divdiff(F f, T tstart, Args... t, T tend) {``

我的编译器是gcc

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 8.0.0 (clang-800.0.42.1) Target: x86_64-apple-darwin15.4.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin

有谁知道为什么它不起作用以及如何解决它

最佳答案

template<typename F, typename T, typename... Args>
T divdiff(F f, T tstart, Args... t, T tend)

Args... t不在参数列表的末尾,则不会推导。不允许这样的推导部分是为了简化语言规则,部分是为了帮助保持程序简单(并防止搬起石头砸自己的脚)。您可以指定 Args ...明确喜欢divdiff<F, double, double> ,但是对于递归调用,很难删除最后一个 double .

在任何情况下,可变参数模板方法都存在模板膨胀和效率低下的问题,因为参数列表可能会被每个函数调用复制。由于序列的元素都应该是同一类型,因此请考虑使用迭代器。然后你可以使用 std::initializer_list 添加一个方便的重载用于基于数组的可迭代序列。

template< typename F, typename bidirectional_iterator >
typename std::iterator_traits< bidirectional_iterator >::value_type
divdiff( F f, bidirectional_iterator first, bidirectional_iterator last ) {
bidirectional_iterator next = std::next( first );
bidirectional_iterator prev = std::prev( last );
auto diff = next == prev?
f( * first ) - f( * prev )
: divdiff( f, first, prev ) - divdiff( f, next, last );
return diff / ( * first - * prev );
}

template< typename F, typename T >
T divdiff( F f, std::initializer_list< T > il )
{ return divdiff( f, il.begin(), il.end() ); }

Demo .

关于c++ - 使用可变参数模板在 C++ 中实现分差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41711200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com