基本问题陈述
我正在学习 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 …
我正在为自己制作的游戏开发音频引擎。但是,当我播放声音片段时,它们通常都可以播放,但会失真和失真。我产生了一个正弦波,应该给出纯正的音调,但是它仍然有这种失真-因此,我认为它在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)