簡體   English   中英

使用類成員作為成員函數的默認參數

[英]Using a class member as a default argument for a member function

除了手動重載相應的成員函數並以成員為參數調用第一個重載之外,還有其他方法嗎?

我正在嘗試類似的東西

class test
{
    string t1="test";

    testfun( string& val = this->t1 )
    { /* modify val somehow */ }
};

(測試一下: http : //goo.gl/36p4CF

目前我想沒有技術原因為什么這不可行。

  • 除了重載和手動設置參數之外,是否有其他解決方案?
  • 為什么這不起作用,是否有技術原因?

[dcl.fct.default]/8:

關鍵字this不應在成員函數的默認參數中使用。

這是一般問題的特例:您不能在參數的默認參數中引用其他參數。 IE

void f(int a, int b = a) {} 

是畸形的。 所以會

class A
{
    int j;
};

void f(A* this, int i = this->j) {}

這基本上是編譯器將void f(int i = j) {}形式的成員函數轉換為的內容。 這源於函數參數和后綴表達式(構成對象參數)的計算順序未指定的事實。 [dcl.fct.default]/9:

每次調用函數時都會評估默認參數。 函數參數的計算順序未指定。 因此,函數的參數不應在默認參數中使用,即使它們沒有被求值。

除了重載和手動設置參數之外,是否有其他解決方案?

不,如果您希望默認參數依賴於另一個參數(包括this ,則需要重載。 雖然在這種情況下,它沒有意義,因為這是一個構造函數,並且t1在它被調用之前不存在。

為什么這不起作用,是否有技術原因?

因為未指定函數參數的求值順序。 要在默認參數中允許參數值,您需要更復雜的規則來確保每個參數在使用之前都已初始化。

你還沒有說出你想要達到的目標。 我假設您需要每個實例都以特定方式做出反應,具體取決於某個類變量。

但是,如果您不需要每個實例的行為,那么您可以使用靜態變量。 以下工作:

#include <iostream>
using namespace std;
struct test {
  static string t1;  
  void say(const string &val=t1){
    cout << val << "!" << endl;
  }
};

string test::t1;

int main() {
   cout << "Hello World" << endl; 
   test::t1 = string("asd");
   test a;
   a.say();
   a.say("bla");
   test::t1 = string("blahblah");
   a.say();
   return 0;
}

...這意味着類test所有對象都將使用靜態字符串t1作為它們的默認值。

您可以稍微“破解”一下,並將其用作丑陋的哨兵:

  void say(const string &val=t1){
    if (&val == &t1) {
      // They are using the default value, so act as you want
    } else {
      // they are providing a value
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM