这是我的另一个问题的 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 <= …
我试图通过递归地分配给一个类来展开参数包。我想从右到左执行此操作,因为某些操作确实处于待处理状态。
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...>并在那里执行参数包声明顺序。
该线程上的其他答案提供了如何提取最后一个值,但这仍然不允许您进行递归参数包展开,这是本文的重点。从右到左展开参数包是不可能的吗?
我在作为分片复制集的一部分的框上运行以下命令.我只是想从这个特定的分片导出,我也会在另一个分片上运行相同的命令.
当我这样做时,Mongo应该倾倒最多172万条记录,但相反,看起来它正试图导出该集合中总共5.9亿条记录.为什么查询不适用并只导出我选择的数据?
mongodump -d obscured -c message --query "{sendDate: {\$gt: 1380499200}}" \
--out=da1-messagedump --port=27018
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
当我尝试在 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)
有什么办法可以改变它吗?
我正在尝试使用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) 我写了一个程序,它应该取一个字符串和一个字母,然后调用一个函数,它有两个参数(字符串,字母),然后计算字符串中字母的频率.
我的代码的问题是它总是返回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) 目标是在一定范围的输入值上最小化函数。性能很重要。不幸的是,该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 ++模板。
我的用例是从列表返回最大值的方法。
但是,由于我使用的是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) 我正在尝试学习如何计算我通过 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) 我正在生成constexpr std::array一个类的内部constexpr,但我只想在使用该类的所有项目中使用该类的一个实例。
我最初将其设为全局变量,但后来发现,如果我在多个翻译单元中迭代数组,这些全局变量就会重复。然后我尝试使用一个constexpr函数,但我无法拥有static这样一个函数的内部。我使用的是c++14,所以我不能使用变量inline constexpr。变量extern constexpr没有意义,因为如果将声明与定义分开,那么constexpr当只需要一项时,如何以编译时而不是运行时的方式处理这些值?
还有其他选择吗?
编辑:参见https://godbolt.org/z/5PcboYov4
请记住,我没有定义常规变量。我正在定义一个constexpr变量。区别很重要。它被用于非上下文constexpr和constexpr上下文中。
如何编写一个要求类具有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++ ×7
c ×3
c++20 ×2
arrays ×1
c++-concepts ×1
c++11 ×1
c++14 ×1
calculator ×1
constexpr ×1
gcloud-java ×1
java ×1
logarithm ×1
min ×1
minimization ×1
mongodb ×1
mongodump ×1
noexcept ×1
std-ranges ×1
struct ×1
templates ×1