小编use*_*759的帖子

C++使用一种方法实现不同类型的赋值并且没有警告的优雅方式?

我必须实现基本相同的功能,但不同的大小.具体来说就是......

type& operator=(unsigned int);
type& operator=(unsigned long int);
type& operator=(unsigned long long int);
type& operator=(int);
type& operator=(long int);
type& operator=(long long int);
type& operator=(short int);
//so on and so forth...
Run Code Online (Sandbox Code Playgroud)

他们必须做同样的事情...(除了我应该考虑到不同的大小),主要的想法是"如果类型是最广泛使用任务的代码...否则执行转换和执行代码".是否可以通过仅使用一种方法来避免所有这样的重复代码?(我只是不希望编译器在编译时给我一些警告......).

谢谢

c++ polymorphism assignment-operator

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

元编程用于优化存储/运行时算法,C++

我想在不考虑底层结构是数组的情况下概括C++中的按位运算符.

例如......如果我想代表86位,我将使用结构结构/类,如:

typedef struct {
 uint64_t x[1];
 uint16_t y[1];
 uint8_t z[1];
} sampleStruct;
Run Code Online (Sandbox Code Playgroud)

相反,如果我想分配160位,我会使用如下结构:

typedef struct {
 uint64_t x[2];
 uint32_t y[1];
} sampleStruct;
Run Code Online (Sandbox Code Playgroud)

我认为存储的一个微不足道但不是最优的解决方案是假设所有块都是统一的并且分配最小值,它覆盖我正在实现的大小,但是即使是练习,我更喜欢我暴露的方式.

对我而言,听起来我应该使用元编程来解决问题,所以我必须正确定义

template <int I>
typedef sampleStruct {
  //something
}
Run Code Online (Sandbox Code Playgroud)

但是我不是C++模板元编程的大专家,所以我想了解实现不同类型的示例struct变量的最佳方法.我知道如何为我的长度决定最好的"封面"是这样的:

N64 = I/64;
RemN = I%64;
if(0 < RemN <= 8) {
  add uint8_t var;
} else if (8 < RemN <= 16) {
  add uint16_t var;
} else if (16 < RemN <= 24) {
  add uint16_t var;
  add uint8_t var;
} else {
  //Similarly …
Run Code Online (Sandbox Code Playgroud)

c++ templates metaprogramming c++11

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

理解 C++11 中的 `memory_order_acquire` 和 `memory_order_release`

我正在阅读文档,更具体地说

memory_order_acquire:具有此内存顺序的加载操作在受影响的内存位置上执行获取操作:在此加载之前,当前线程中的任何读取或写入都不能重新排序。其他线程中释放同一原子变量的所有写入在当前线程中都是可见的(请参阅下面的释放-获取顺序)。

memory_order_release:具有此内存顺序的存储操作执行释放操作:在该存储之后,当前线程中的任何读取或写入都不能重新排序。当前线程中的所有写入在获取相同原子变量的其他线程中都是可见的(请参阅下面的释放-获取顺序),并且携带对原子变量的依赖项的写入在消耗相同原子的其他线程中变得可见(请参阅释放-消费以下订购)

这两位:

来自内存_订单_获取

...在此加载之前,当前线程中的任何读取或写入都不能重新排序...

来自内存_顺序_释放

...当前线程中的读取或写入操作在此存储之后不能重新排序...

它们到底是什么意思?

还有这个例子

#include <thread>
#include <atomic>
#include <cassert>
#include <string>

std::atomic<std::string*> ptr;
int data;

void producer()
{
    std::string* p  = new std::string("Hello");
    data = 42;
    ptr.store(p, std::memory_order_release);
}

void consumer()
{
    std::string* p2;
    while (!(p2 = ptr.load(std::memory_order_acquire)))
        ;
    assert(*p2 == "Hello"); // never fires
    assert(data == 42); // never fires
}

int main()
{
    std::thread t1(producer);
    std::thread t2(consumer);
    t1.join(); t2.join();
}
Run Code Online (Sandbox Code Playgroud)

但我无法真正弄清楚我引用的两个位适用于哪里。我明白发生了什么,但我并没有真正看到重新排序位,因为代码很小。

c++ multithreading

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

Payne Hanek算法在C中的实现

我很难理解如何实现Payne和Hanek发布的范围缩减算法(三角函数的范围缩减)

我见过这个图书馆:http: //www.netlib.org/fdlibm/

但它看起来如此扭曲,我所创立的所有理论解释都太简单了,无法提供实现.

有一些好的......好的...很好的解释吗?

c algorithm floating-point floating-accuracy

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

函数C++中具有大小返回类型的模板?

是否可以以这种方式设计模板功能

template <typename T1, typename T2>
T3 f(T1 x, T2 y);
Run Code Online (Sandbox Code Playgroud)

如果sizeof(T1) > sizeof(T2)那么T3 = T1,否则T3 = T2

进一步要求......

我试图定义类似的东西:

template <int i>
struct A {
    int a;
};

template <int j>
struct B {
    int b;
};

template <int i, int j>
typename std::conditional< i > j , A<i>, B<j> >::type
func() {
    ;
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译时......

Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -o main.o "..\\main.cc" 
In …
Run Code Online (Sandbox Code Playgroud)

c++ variables storage templates

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

静态函数与静态成员函数 C++

我一直在阅读一些有关静态函数和静态成员函数的内容。根据我的理解,如果一个函数被声明为静态,那么该函数仅对其翻译单元可见,而对其他地方不可见。相反,静态成员函数是无需实例化其类的任何对象即可调用的函数(因此您可以像在名称空间中一样使用它)。

为了用静态函数来澄清,我的意思是

static int foo(int a, int b)
{
   return a + b;
}
Run Code Online (Sandbox Code Playgroud)

对于静态成员函数,我的意思是

struct MyClass
{
   static int foo(int a, int b)
   {
      return a + b;
   } 
}
Run Code Online (Sandbox Code Playgroud)

这是唯一的区别吗?或者同一翻译单元内的可见性仍然是他们两个的共同特征?

c++ static-methods static-functions

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

将浮点数拆分为两个其他数字的总和,而不会出现舍入错误

我不知道是否有可能做到这一点,但我需要将两个数字之和的浮点数分开...

例如假设x是一个浮点数,我们希望将其拆分为 x = I + f,其中I是有符号整数部分,而f是有符号小数部分,两个浮点数我想这样的分裂可以完全实现(即没有fp错误我的意思是).

我想知道是否有可能以某种方式分割x =(I-1.0)+(f + 1.0),即没有浮点舍入误差.

我已经实现了我自己的分割x = I + f然后求和并添加1.0我有第二个分割我呈现,但基本上它受浮点舍入误差这样的操作.

floating-point split floating-accuracy

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

在 gnuplot 中添加网格

我有以下脚本,可以在 gnuplot 中正常运行(不幸的是我有一个旧版本,现在我对此无能为力,它是 4.0)。

set xlabel "y" 
set ylabel "rw[j]"
set title "P-D diagram"
set zeroaxis

set xzeroaxis
plot [0.5:1] \
-5.71429*x title "L[-5]" linetype 1, \
-4.28571*x title "U[-5]" linetype 3, \
-4.71429*x title "L[-4]" linetype 1, \
-3.28571*x title "U[-4]" linetype 3, \
-3.71429*x title "L[-3]" linetype 1, \
-2.28571*x title "U[-3]" linetype 3, \
-2.71429*x title "L[-2]" linetype 1, \
-1.28571*x title "U[-2]" linetype 3, \
-1.71429*x title "L[-1]" linetype 1, \
-0.285714*x title "U[-1]" linetype 3, …
Run Code Online (Sandbox Code Playgroud)

gnuplot

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

统一更改Texture2D格式

我有一个Textured2D加载,表示ETC_RGB4我如何将其更改为另一种格式?说RGBA32.基本上我想从3个通道切换到4个通道,每通道4个比特切换到每通道8个通道.

谢谢

c# unity-game-engine

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

gcc编译多个文件

我有这五个来源

main.c中
src_print1.c
src_print2.c
header_print1.h
header_print2.h

内容很简单,各个文件如下:

main.c中

#include "header_print1.h"
#include "header_print2.h"

int main(int argc, char** argv) {
    print1();
    print2();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

header_print1.h

#ifndef PRINT_1
#define PRINT_1

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

void print1();

#endif
Run Code Online (Sandbox Code Playgroud)

header_print2.h

#ifndef PRINT_2
#define PRINT_2

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

void print2();

#endif
Run Code Online (Sandbox Code Playgroud)

src_print1.c

#include "header_print1.h"

void print1() {
   printf("Hello 1\n");
}
Run Code Online (Sandbox Code Playgroud)

src_print2.c

#include "header_print2.h"

void print2() {
   printf("Hello 2\n");
}
Run Code Online (Sandbox Code Playgroud)

使用gcc我尝试使用以下命令行进行编译:

  gcc -I ./ -o test -c main.c src_print1.c src_print2.c
Run Code Online (Sandbox Code Playgroud)

一切都在同一个文件夹中.我得到的错误是:

gcc: cannot …
Run Code Online (Sandbox Code Playgroud)

c gcc

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