相关疑难解决方法(0)

SFINAE检查操作员+ =

我试图消除过载集中的重载(如果operator+=缺少).

我知道如何检查是否T+T合法:

template<typename T,
         typename CheckTplusT = decltype(std::declval<T>() + std::declval<T>())>
void foo(T a, T b, ...)
{
  a = a + b;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用 +=

template<typename T,
         typename CheckTplusT = decltype(std::declval<T>() += std::declval<T>())>
void foo(T a, T b, ...)
{
  a += b;
}
Run Code Online (Sandbox Code Playgroud)

这可以通过在内部使用另一个表达式来修复,decltype还是需要另一个SFINAE构造?

我需要从重载集中消除它的原因是它与另一个重载冲突,它接受一个functor用作替代+=.编译器是VS2013,gcc4.8

c++ sfinae

14
推荐指数
2
解决办法
823
查看次数

使用std :: accumulate计算均值失败

我正在尝试使用以下代码计算双精度向量的平均值(编译g++ mean.cc -std=c++0x):

// mean.cc

#include <algorithm>
#include <iostream>
#include <vector>

struct Mean {
  unsigned int n;
  Mean(unsigned int n) : n(n) {}
  double operator()(double sum, double x) {
    return sum + x/n;
  }
};

int main () {
  std::vector<double> v = {1,2,3,4,5,6};
  Mean mean(v.size());
  std::cout << "mean: " << std::accumulate(v.begin(), v.end(), 0, mean) << "\n";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

3.5我认为平均值应该是.然而该程序打印mean: 1.

如果我删除除法n,我operator()的元素总和按预期计算.我在这做错了什么?

c++ std

7
推荐指数
1
解决办法
2347
查看次数

std :: accumulate没有按预期行事

我使用std :: accumulate和测试代码得到了意想不到的结果.我试图添加一个大的双向量,但由于某种原因,值溢出:

#include <iostream>
#include <vector>
#include <functional>
#include <numeric>

using namespace std;

double sum(double x, double y)
{
    // slows things down but shows the problem:
    //cout << x << " + " << y << endl;
    return (x+y);
}

double mean(const vector<double> & vec)
{
    double result = 0.0;

    // works:
    //vector<double>::const_iterator it;
    //for (it = vec.begin(); it != vec.end(); ++it){
    //      result += (*it);
    //}

    // broken:
    result = accumulate(vec.begin(), vec.end(), 0, sum);

    result /= vec.size(); …
Run Code Online (Sandbox Code Playgroud)

c++ stl

1
推荐指数
1
解决办法
276
查看次数

标签 统计

c++ ×3

sfinae ×1

std ×1

stl ×1