小编ten*_*jed的帖子

当 enable_if<> = void 不起作用时,为什么 enable_if<>* = nullptr 起作用?

基本问题陈述

我正在学习 SFINAE。我尝试了一个非常简单的enable_if

// 1: A foo() that accepts arguments that are derived from Base
template <typename T, typename Enable = enable_if_t<std::is_base_of_v<Base, T>>>
void foo(T thing) {
    std::cout << "It's a derived!" << std::endl;
}

// 2: A foo() that accepts all other arguments
template <typename T, typename Enable = enable_if_t<!std::is_base_of_v<Base, T>>>
void foo(T thing) {
    std::cout << "It's not a derived." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨说foo是多重定义的。互联网告诉我,这是因为检查函数签名时模板参数不相关。

我试过的变体

为了尽可能进行最基本的元编程,我开始用语法来解决这个问题。这是我为该enable_if语句尝试的内容列表(倒置语句,即!std::is_base_of相同,但为简洁起见省略了):

匿名类型,否typename,等于0 …

c++ templates enable-if c++17

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

OpenAL失真的常见来源?

我正在为自己制作的游戏开发音频引擎。但是,当我播放声音片段时,它们通常都可以播放,但会失真和失真。我产生了一个正弦波,应该给出纯正的音调,但是它仍然有这种失真-因此,我认为它在OpenAL端。

问题是,我对OpenAL并没有任何幻想。

首先,我生成48000个正弦波样本

  #include <math.h>
  #define PI 3.14159265

  float amplitude = .5f;
  float frequency = 440;
  float phase = 0.f;
  float time = 0.f;
  int sampleRate = 48000;
  float dt = 1.0f / sampleRate;

  float sineWave[48000];
  fox_for(sample, sampleRate) { // standard macro for for loop
    float val = amplitude * sin(2 * PI * frequency * time + phase);
    sineWave[sample] = val;
    time += dt;
  }
Run Code Online (Sandbox Code Playgroud)

一切都很好。一堆浮子以[-.5,.5]为正弦波。然后,我执行标准的OpenAL步骤:生成源和缓冲区。将数据绑定到缓冲区,然后将缓冲区绑定到源,然后播放声音。

// Open device and context
if (ALCdevice *device = alcOpenDevice(NULL)) {
    if (ALCcontext …
Run Code Online (Sandbox Code Playgroud)

c++ audio openal ogg game-engine

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

标签 统计

c++ ×2

audio ×1

c++17 ×1

enable-if ×1

game-engine ×1

ogg ×1

openal ×1

templates ×1