由于布尔类型模板函数中未使用参数,如何在 C++ 中拥有备用函数签名?

问题描述 投票:0回答:1

我的目标是有一个库提供我的函数的多个实例

increment
,基于唯一的定义以避免代码冗余:

template <bool modify>
int increment(int a, int b) {
    if constexpr(modify)
        return a+=b;
    else
        return ++a;
}

正确实例化后,我有两种不同的实现,具体取决于

modify
的值。

问题是,当

modify
为 false 时,函数参数
b
仍然是必需的,但从未使用过。

我想要的:要求编译器提供带有签名的实例:

template int increment<false>(int a)
,无需自己实现(我的函数
increment
必须有一个实现)。

理想情况下,在我的库中

.h
我会有类似的东西:

template <bool modify>
int increment(int a, int b);

template int increment<false>(int a);

我知道为

b
分配默认值可能是一种解决方法,但这不是我想要的。

这是一个简化的问题,我希望它能够复制我的实际问题。 我不知道 C++ 标准是否提供了这样的解决方案,或者我是否应该接近元编程扩展,或者转到特定的编译器。

提前谢谢您。

c++ templates template-meta-programming signature compile-time
1个回答
1
投票

这是一个具有单一实现的函数模板:

template <bool modify, class... Args>
int increment(Args... args) {
    return modder<modify>(args...).res;
}
另一方面,

modder
是一个有专门化的课程:

template <bool>
struct modder {        // the primary template will match the `true` case
    modder(int a, int b) : res(a + b) {}
    int res;
};

template <>
struct modder<false> { // specialization for the `false` case
    modder(int a) : res(a + 1) {}
    int res;
}
© www.soinside.com 2019 - 2024. All rights reserved.