【问题标题】:How do I set parameter default values that rely on other parameters?如何设置依赖于其他参数的参数默认值?
【发布时间】:2013-11-18 18:54:21
【问题描述】:

以下代码按预期编译和工作。

#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;
}

但是,我希望根据之前的参数推导出 size 参数的默认值。比如:

void function(std::vector<int> vec, int size=vec.size());

但这会导致:
错误:局部变量“vec”可能不会出现在此上下文中

这并不让我感到惊讶;我假设它需要在编译时知道默认值。那么我是否将函数模板化?如何使函数模板化,使得参数仍然是一个 int,而向量仍然是一个 int 向量,并且默认情况下将 size 参数推断为传入的向量的大小。

我不想在函数调用期间传递向量的大小。

【问题讨论】:

  • I assume it needs to know the default value at compile time,这不是真的,实际上你可以使用全局变量作为默认参数,但是因为函数参数评估顺序没有定义,C++标准明确禁止访问评估默认值时的参数。

标签: c++ c++11 parameters parameter-passing default-value


【解决方案1】:

如果基于第一个参数,为什么还需要第二个参数?

    void function(std::vector<int> vec ){
        size_t size = vec.size();
        //code..
        return;
    }

不是更简单吗?

【讨论】:

  • 因为他希望调用者指定一个与默认大小不同的值。
  • 是的,这个函数是递归的,每次都有一个变化的“大小值”。我只是想避免在根调用中传递它,因为它总是 vec.size()
【解决方案2】:

如果您真的想要一个带有大小参数的函数,并且希望大小默认为向量大小(而不是仅仅将其作为局部变量获取),那么您可以使用 two 来解决这个问题职能。一个只取向量,一个取向量和大小(没有默认值)。那么只有一个参数的函数就可以调用第二个了。

所以

void function(const std::vector<int>& vec, const size_t size)
{
   ...
}

void function(const std::vector<int>& vec)
{
   function(vec, vec.size());
}

【讨论】:

  • 这可能就是我想要的解决方案。特别是因为我正在制作 std::function 对象,这是唯一需要第二个参数的函数。
猜你喜欢
  • 2022-11-14
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多