The following code compiles and works as expected.
#include <vector>
void function(std::vector<int> vec, int size=1);
int main(){
std::vector<int> vec = {1,2,3};
function(vec);
}
void function(std::vector<int> vec, int size){
//code..
return;
}
However, I would like the size parameter's default value to be deduced based on a previous parameter. So for example:
void function(std::vector<int> vec, int size=vec.size());
But this however results in:
error: local variable ‘vec’ may not appear in this context
Which doesn't surprise me; I assume it needs to know the default value at compile time. So do I make the function templated? How would I make the function templated in such a way that the parameter is still an int, and the vector, is still a vector of ints, and the size parameter is deduced to be the passed in vector's size by default.
I would not like to have to pass in the size of the vector during the function call.
If you truly want a function with a size parameter, and want the size to default to the vector size (instead of just getting it as a local variable), then you could solve this with two functions. One taking just the vector, and one taking the vector and the size (without default). Then the one-argument function can just call the second.
So
void function(const std::vector<int>& vec, const size_t size)
{
...
}
void function(const std::vector<int>& vec)
{
function(vec, vec.size());
}
Why do you need second parameter if it based on the first?
void function(std::vector<int> vec ){
size_t size = vec.size();
//code..
return;
}
Isn't it easier?
来源:https://stackoverflow.com/questions/19830677/how-do-i-set-parameter-default-values-that-rely-on-other-parameters