【发布时间】:2016-01-24 05:46:18
【问题描述】:
我们熟悉基于函数参数的重载。但是为什么我们不能基于非类型模板参数进行重载呢?通过这样的重载,您不必为了重载目的而添加额外的函数参数,这可能会对运行时性能产生负面影响。唉,下面的代码无法编译:
template <bool>
void func() {}
template <int>
void func() {}
int main() {
func<0>();
}
产生的错误信息是
error: call of overloaded 'func()' is ambiguous
func<0>();
^
note: candidate: void func() [with bool <anonymous> = false]
void func() {}
^
note: candidate: void func() [with int <anonymous> = 0]
void func() {}
^
请注意,这可能比
更有效void func(bool) {}
void func(int) {}
允许这种用法有什么问题吗?
【问题讨论】:
-
它在 VS 2013 中对我来说编译得很好。但如果我尝试实际调用其中一个,它会说它是模棱两可的。如果我将
int替换为std::ostream&,那么它就可以正常工作。不过,可能是特定于 VS 的。 -
你有exact usage scenario (MCVE)吗?如果您不实例化模板,它不会生成任何代码。那么,你如何实例化它们呢?另外,你如何调用那些重载的函数(在第二个 sn-p 中)?
-
@SergeyTachenov MCVE 中的“C”已经完成。我确信可以创建一个 MCVE。
-
你可以声明它们;你不能真正使用
bool一个,因为模板参数没有迷你重载分辨率;模板参数类型的有效转换常量表达式的所有内容都同样好。无论如何,如果您确实看到传递给控制重载解决方案的虚拟参数的负面影响,您应该向编译器供应商提交错误,而不是扭曲您的代码(进一步)。 -
如果调用
func(bool)与func<true>()对您的应用程序的性能产生影响,我会说您的状态非常好。
标签: c++ templates overloading language-lawyer