小编Bob*_*b__的帖子

别名结构和数组C++方式

这是我的另一个问题的 C++后续

在ISO C之前的旧时代,以下代码会让人感到惊讶:

struct Point {
    double x;
    double y;
    double z;
};
double dist(struct Point *p1, struct Point *p2) {
    double d2 = 0;
    double *coord1 = &p1->x;
    double *coord2 = &p2->x;
    int i;
    for (i=0; i<3; i++) {
        double d = coord2[i]  - coord1[i];    // THE problem
        d2 += d * d;
    }
    return sqrt(d2);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个问题的行使用指针算法(p[i]定义 *(p + i)).其明确地不是由标准允许的任何阵列的外面草案4659用于C++ 17说,在8.7 [expr.add]:

如果表达式P指向具有n个元素的数组对象x的元素x [i],则表达式P + J和J + P(其中J具有值j)指向(可能是假设的)元素x [i + j]如果0 <= …

c c++ arrays struct language-lawyer

28
推荐指数
2
解决办法
1976
查看次数

如何从右向左展开参数包

我试图通过递归地分配给一个类来展开参数包。我想从右到左执行此操作,因为某些操作确实处于待处理状态。

template <typename... T>
class Foo;

template <typename T>
class Foo<T> {/* base case implementation*/};

template <typename T, typename R, typename... Rs>
class Foo<T, Rs..., R> {
   private:
     Foo<T, Rs...> foo_;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,以上让我:

类模板部分专业化包含无法推导的模板参数;
这种部分专业化将永远不会使用

这对我来说似乎很奇怪,我认为即使参数已切换顺序,Foo<T, Rs..., R>但仍应与模板专用化匹配。

我看过一些类似的问题:

特别是C ++模板的部分专业化:为什么我不能匹配可变参数模板中的最后一个类型?

但是,对我来说,最高票数(不被接受)的答案是没有意义的。当然,我知道模板参数包声明必须在声明的最后,但是我这样做是为了模板专门化。

我不确定为什么编译器无法映射Foo<T, Rs..., R>到初始模板声明,Foo<T...>并在那里执行参数包声明顺序。

该线程上的其他答案提供了如何提取最后一个值,但这仍然不允许您进行递归参数包展开,这是本文的重点。从右到左展开参数包是不可能的吗?

c++ c++11

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

mongodump不会尊重收集查询

我在作为分片复制集的一部分的框上运行以下命令.我只是想从这个特定的分片导出,我也会在另一个分片上运行相同的命令.

当我这样做时,Mongo应该倾倒最多172万条记录,但相反,看起来它正试图导出该集合中总共5.9亿条记录.为什么查询不适用并只导出我选择的数据?

mongodump -d obscured -c message --query "{sendDate: {\$gt: 1380499200}}" \ 
          --out=da1-messagedump --port=27018
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

mongodb mongodump

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

声明指针时,VS 自动将星号移动到指针的类型

当我尝试在 VS 2019 中声明一个指针时,星号会自动移动到指针的类型侧。是的,我知道这也有效,但让我烦恼。

// It automatically formats this way
int* number1{};

// But I want it to just stay how I typed it: 
int *number2{};
Run Code Online (Sandbox Code Playgroud)

有什么办法可以改变它吗?

c++ visual-studio visual-studio-2019

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

GQL禁止文字错误,谷歌数据存储

我正在尝试使用GQL从数据存储区中获取一些数据.

当我SELECT * FROM Kind提出请求时,它可以正常工作,我会收到数据.

但是,当我尝试:

SELECT * FROM kind where num < 1234
Run Code Online (Sandbox Code Playgroud)

我得到一个不允许的字面错误.

我甚至尝试用引号做到这一点:

SELECT * FROM kind where num < '1234'
Run Code Online (Sandbox Code Playgroud)

但我得到了同样的错误.

有没有人遇到过这个?

这是代码:

Query<Entity> query = Query.gqlQueryBuilder(Query.ResultType.ENTITY,             
          "SELECT * FROM " + kind + " WHERE num < '100'"
          ).build();
  QueryResults<Entity> results = datastore.run(query);
  while (results.hasNext()) {
    Entity result = results.next();
   myList.add(result.getString("num"));
Run Code Online (Sandbox Code Playgroud)

java google-app-engine google-cloud-datastore gcloud-java

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

C中的频率功能

我写了一个程序,它应该取一个字符串和一个字母,然后调用一个函数,它有两个参数(字符串,字母),然后计算字符串中字母的频率.

我的代码的问题是它总是返回num值为零的任何字母.

#include <stdio.h>
#include <stdlib.h>

int Occur(char [], char);

int main()
{
    char s[100], l;
    printf("Enter A String:\n");
    scanf("%s",s);
    printf("Enter A Letter:\n");
    scanf("%c",&l);
    getchar();

    printf("Num Of Occurance is %d ",Occur(s,l));

    return 0;
}

int Occur(char S[100], char L)
{
    int i;
    int num=0;

    for(i=0; S[i]!='\0'; i++)
    {
        if(S[i]==L)
        num++;
    }

    return num;
}
Run Code Online (Sandbox Code Playgroud)

c

5
推荐指数
2
解决办法
369
查看次数

可以避免范围最小重新计算吗

目标是在一定范围的输入值上最小化函数。性能很重要。不幸的是,该ranges::min()算法一遍又一遍地重新计算实时最优的输出。

看起来该算法可以缓存与最佳值相对应的输出值,或者我错过了什么?

在这个例子中,为什么f(x=0)需要调用n次呢?

#include <ranges>
#include <algorithm>
#include <stdio.h>
using namespace std;

int main()
{
    auto f=[](int x){
        printf("calling f(x=%d)\n", x);
        return x*x;
    };
    auto rg = views::iota(0,4);
    int x1 = ranges::min(rg, {}, f);
}
Run Code Online (Sandbox Code Playgroud)

它输出:

调用 f(x=0)
调用 f(x=1)
调用 f(x=0)
调用 f(x=2)
调用 f(x=0)
调用 f(x=3)

有没有ranges::min()更优化的调用方式?

c++ min minimization c++20 std-ranges

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

有没有一种方法可以创建具有不同返回类型的c ++模板?

我想知道是否有一种方法可以编写具有不同返回类型的C ++模板。

我的用例是从列表返回最大值的方法。

但是,由于我使用的是Qt框架,因此此函数应能够处理数字和QString值。当向该函数提供QString列表时,该函数应返回最大字符串的长度。如果传递数值,则输入类型应为返回类型。

我写的是这样的:

template< class T >
auto getMax( QList< T > aList ) -> decltype( std::is_arithmetic< T >::value ? T : int( 0 ) )
{
  if ( std::is_arithmetic< T >::value )
  {
      T Result( aList.isEmpty() ? 0 : aList.first() );
      for ( auto lElement : aList )
      {
          Result = std::max( Result, lElement );
      }

      return Result;
  }

  if ( std::is_same< T, QString >::value )
  {
      // List contains QString -> return length of largest string …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

尝试在没有 Math.h 的情况下计算以 10 为底的对数(非常接近)只是在连接函数时遇到问题

我正在尝试学习如何计算我通过 scanf 输入到我的代码中的任何数字的对数以 10 为底。我想我可以计算出 ln(a) a 是输入的数字。我有一个计算这个的工作代码;但是现在我只想将我的 ln(a) 代码输出的任何数字除以定义的 LN10。这是因为数字的自然对数除以 10 的自然对数将输出我正在努力实现的所需的以 10 为底的对数值。这是我目前的混乱情况。非常感谢任何帮助!

#define _CRT_SECURE_NO_WARNINGS
#define ALMOSTZERO 0.0000000000000000001
#define LN10 2.3025850929940456840179914546844

#include <stdio.h>

double log10(double);
double ln(double);

void main()
{
    {
    double x, a;
    printf("Enter value: ");
    scanf("%lf", &x);
    while (x > 0)
    {
        double log10 = ln(x) * LN10;
        printf("log10(%lf)=%lf\n", x, a);
        printf("Enter value:  ");
        scanf("%lf", &x);
    }
    }
}

double ln(double x)
{
    double sum = 0.0;
    double xmlxpl = (x - 1) / (x + …
Run Code Online (Sandbox Code Playgroud)

c logarithm calculator

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

如何定义一个 constexpr 构造数组,该数组在多个翻译单元上只有一个实例?

我正在生成constexpr std::array一个类的内部constexpr,但我只想在使用该类的所有项目中使用该类的一个实例。

我最初将其设为全局变量,但后来发现,如果我在多个翻译单元中迭代数组,这些全局变量就会重复。然后我尝试使用一个constexpr函数,但我无法拥有static这样一个函数的内部。我使用的是c++14,所以我不能使用变量inline constexpr。变量extern constexpr没有意义,因为如果将声明与定义分开,那么constexpr当只需要一项时,如何以编译时而不是运行时的方式处理这些值?

还有其他选择吗?

编辑:参见https://godbolt.org/z/5PcboYov4

请记住,我没有定义常规变量。我正在定义一个constexpr变量。区别很重要。它被用于非上下文constexprconstexpr上下文中。

c++ constexpr c++14

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

C++:如何编写一个要求构造函数为 noexcept 的概念?

如何编写一个要求类具有noexcept构造函数的概念?例如,以下内容static_assert在 Clang 15.0.7 中是正确的,尽管我觉得不应该。

class Ragdoll {
    int age_ = -1;
public:
    Ragdoll(int age) /* noexcept */ : age_(age) {}

    int meow() const;
    int lose_hair();
};

template<typename Cat>
concept cat = requires(Cat cat) {
    noexcept(Cat{42});
    { cat.meow() } -> std::same_as<int>;
};

static_assert(cat<Ragdoll>);
Run Code Online (Sandbox Code Playgroud)

noexcept那么这个表达式在概念中到底在做什么呢?(也请随意链接任何好的概念教程)

c++ noexcept c++-concepts c++20

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