gpt4 book ai didi

c++ - 如何区分具有非类型参数的模板重载?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:13 27 4
gpt4 key购买 nike

这里有两个模板函数,它们的区别仅在于它们的模板参数。其余参数完全相同。

    template<int module>
void template_const(int &a,int & b){
a = a & module;
b = b % module;
}

template<bool x>
void template_const(int &a,int & b){
int w;
if (x){
w = 123;
}
else w = 512;
a = a & w;
b = b % w;
}

当我尝试这样称呼他们时

template_const<true>(a,b)

template_const<123>(a,b)

编译器告诉我调用不明确。如何调用这两个函数?

最佳答案

正如@jogojapan 所指出的,问题在于编译器无法对这两个函数进行排序,即没有一个比另一个更专业。如 §14.5.6.2 中所述,当对重载函数模板的调用不明确时,编译器会在各种重载之间使用偏序来选择最专用的一个。

为了对重载进行排序,编译器转换它们中的每一个并执行模板参数推导以查看一个是否比另一个更专业(在 this answer 的末尾有一个简短的解释)。在您的情况下,这两个重载是等效的(或不可比较的): template<int> void template_const(int &,int &) 并不比 template<bool> void template_const(int &, int &) 更专业,反之亦然。

因此,编译器无法选择其中之一,从而产生 ambiguous call 错误。


如果您可以明确指定要传递的参数类型,则可以使用部分模板特化,如下所示:

template<typename T, T param>
struct template_const_impl;

template <int module>
struct template_const_impl<int, module>
{
static void apply(int &a, int &b)
{
a = a & module;
b = b % module;
}
};

template<bool x>
struct template_const_impl<bool, x>
{
static void apply(int &a, int &b)
{
const int w = x ? 123 : 512;
a = a & w;
b = b % w;
}
};

template <typename T, T param>
void template_const(int &a, int &b)
{
return template_const_impl<T, param>::apply(a, b);
}

int main()
{
int i = 512, j = 256;
template_const<int, 123>(i, j);
template_const<bool, true>(i, j);
}

这并不理想,但它认为没有更干净的解决方案,除非您可以使用 C++11 并愿意依赖一些宏,在这种情况下您可以稍微简化调用代码(采取的想法来自 this answer 中的@Nawaz):

#define TEMPLATE_CONST(x) template_const<decltype(x), x>

int main()
{
int i = 512, j = 256;
TEMPLATE_CONST(123)(i, j);
TEMPLATE_CONST(true)(i, j);
}

关于c++ - 如何区分具有非类型参数的模板重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17313649/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com