【问题标题】:How to find out if user has specified a value for a default argument?如何确定用户是否为默认参数指定了值?
【发布时间】:2016-08-18 10:01:08
【问题描述】:

我有一个带有默认参数的 C++ 函数。

在函数中,如果我发现此参数具有默认值,则可能有两种可能性 - (A) 调用此函数的用户没有为该参数提供值,因此分配了默认值 (B) 用户提供此参数的默认值。

我需要能够区分这两种情况。这样做的最佳方法是什么?

【问题讨论】:

  • 使用两个不同的重载函数。
  • 那会解决什么问题?你到底想解决什么问题?
  • 默认值的正确选择取决于上下文,如果用户没有指定值,我需要根据上下文对默认值做出明智的选择。但是,如果值来自用户,我打算使用它而不用担心上下文。
  • 所以,如果用户不提供值,默认值是没有用的。那为什么你首先有一个默认值?使用重载作为 n.m。和 Peter K 建议。
  • 是的,使用不同的功能,因为它们做不同的事情:一个功能自己做出明智的选择,另一个使用用户提供的功能。第一个当然可以调用第二个。

标签: c++ function parameters optional-parameters default-arguments


【解决方案1】:

AFAIK,编译器替换调用站点的默认参数。无法将此与提供完全相同参数的用户区分开来。

您可以使用两种不同的函数来区分这两种情况:一种具有您要为其指定默认值的参数,另一种没有。

【讨论】:

    【解决方案2】:

    使用重载函数。

    void do_great()
    {
        // default operation
    }
    
    void do_great(int value)
    {
        // non-default operation
    }
    

    【讨论】:

      【解决方案3】:
      class A
      {
      private:
         const int _defaultValue = 0;
      
      public:
         void function(int userValue = _defaultValue)
         {
            if (userValue != _defaultValue)
               ....;
            else
               ....;
      ....
      

      函数也一样:

      namespace { const int defaultValue = 0; }
      void function(int userValue = defaultValue);
      

      【讨论】:

      • 如果用户提供0作为参数,他仍然无法区分默认参数或用户提供的参数。
      • 好吧,在这种情况下只重载:void function()void function(int userValue);
      猜你喜欢
      • 2021-12-24
      • 2010-11-15
      • 1970-01-01
      • 2011-03-24
      • 2012-07-18
      • 2011-10-06
      • 2011-11-24
      • 1970-01-01
      • 2011-12-06
      相关资源
      最近更新 更多