gpt4 book ai didi

c++ - 基于非类型模板参数的重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:10 24 4
gpt4 key购买 nike

我们熟悉基于函数参数的重载。但是为什么我们不能基于非类型模板参数进行重载呢?有了这样的重载,您就不必为了重载目的而添加额外的函数参数,这可能会对运行时性能产生负面影响。唉,下面的代码无法编译:

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) {}

允许这种用法有什么问题吗?

最佳答案

如果你愿意接受一些额外的语法,你可以使用:

// No default implementation.
template <typename T, T value> struct Impl;

// Implement the bool/true version
template <> struct Impl<bool, true>
{
void operator()() {}
};

// Implement the bool/false version
template <> struct Impl<bool, false>
{
void operator()() {}
};

// Implement the int version
template <int N> struct Impl<int, N>
{
void operator()() {}
};

template <typename T, T value>
void func()
{
Impl<T, value>()();
};

int main()
{
func<bool, true>();
func<int, 10>();
}

免责声明

我不知道这是否会比调用 func(true) 执行得更好。

关于c++ - 基于非类型模板参数的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34972679/

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