gpt4 book ai didi

c++ - 什么是可变参数函数模板重载优先规则?

转载 作者:行者123 更新时间:2023-12-05 04:32:16 26 4
gpt4 key购买 nike

我正在使用通用递归格式的可变参数函数模板,每当我处理 vector 时,我都需要更改函数的行为。如果函数模板不是可变参数,则重载效果很好,但对于可变函数模板,解压参数包时重载分辨率似乎会发生变化。

下面的一些代码可以更好地解释我的意思。

#include <iostream>
#include <vector>

template<typename T>
void complexfun(T x) {
std::cout << "1 end" << std::endl;
}

template<typename T, typename... Args>
void complexfun(T x, Args... args) {
std::cout << "1 ";
complexfun(args...);
}

template<typename T>
void complexfun(std::vector<T> x) {
std::cout << "2 end" << std::endl;
}

template<typename T, typename... Args>
void complexfun(std::vector<T> x, Args... args) {
std::cout << "2 ";
complexfun(args...);
}

int main() {
std::vector<int> vint = {2, 3, 4};
float x1 = 9.4;

complexfun(vint); // output: 2 end -> OK
complexfun(vint, x1); // output: 2 1 end -> OK
complexfun(x1, vint); // output: 1 1 end -> WRONG: need 1 2 end

return 0;
}

complexfun(x1, vint) 的执行中,我们应该有 complexfun(vint),但它并不像“独立”调用 complexfun (vint).

非常感谢任何有关为什么会出现这种情况以及如何解决它的帮助!

最佳答案

需要申报template<typename T> void complexfun(std::vector<T>)在应该使用它的函数之前。

只需调换这些函数模板的顺序即可:

template<typename T>                   // this function template
void complexfun(std::vector<T>) {
std::cout << "2 end" << std::endl;
}

template<typename T, typename... Args> // ...before this function template
void complexfun(T, Args... args) {
std::cout << "1 ";
complexfun(args...);
}

Demo

关于c++ - 什么是可变参数函数模板重载优先规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71695335/

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