C++模板根据类型选择代码块

cp.*_*ngr -1 c++ templates c++11

是否可以在C++模板函数中根据参数的类型在编译时启用/禁用代码块?

(如果有可能,我怀疑std::enable_if可能是解决方案的一部分,但我还没有看到如何在编译时基于此选择代码块.)

我想做这样的事情.

template<typename T>
void captureData(T *data, size_t len, T scaleFactor)
{
    initCaptureDevice();

    for (size_t i = 0; i < len; i++)
    {
        IF(T is integral type) // determine at compile time which to use
        {
            data[i] = getRawSample();
        }
        ELSE
        {
            data[i] = getRawSample() * scaleFactor;
        }
    }

    cleanup();
}
Run Code Online (Sandbox Code Playgroud)

c-s*_*ile 5

这个:

template<typename T>
void captureData(T *data, size_t len, T scaleFactor, int anotherParam)
{
    initCaptureDevice();

    for (size_t i = 0; i < len; i++)
    {
        if(std::is_integral<T>::value) // determine at compile time which to use
        {
            data[i] = getRawSample();
        }
        else
        {
            data[i] = getRawSample() * scaleFactor;
        }
    }
    cleanup();
}
Run Code Online (Sandbox Code Playgroud)

将工作得很好 - 编译器将删除未使用的分支的代码 if(constexpr) ... else ...;

  • @ cp.engr在编译时在任何C/C++编译器中 - 这是基本优化(死代码消除). (5认同)