Нестатические члены как параметры по умолчанию в C ++ - PullRequest
15 голосов
/ 19 февраля 2010

Я рефакторинг большого количества кода, где я должен добавить дополнительный параметр для ряда функций, которые всегда будут иметь значение члена этого объекта. Что-то вроде

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc(CMyObject &Object);
   // used to be void MyFunc();
};

Теперь я бы хотел прочитать

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc(CMyObject &Object = A);
};

Но мне не разрешено иметь параметр по умолчанию, который является нестатическим членом. Я прочитал этот похожий вопрос , который предполагает, что это невозможно, но мне интересно, есть ли разумное решение. Причина в том, что в 95% случаев будет использоваться параметр по умолчанию, и, следовательно, использование параметра по умолчанию значительно сократит объем кода, который я должен изменить. Мое лучшее решение до сих пор - что-то вроде этого;

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc(BOOL IsA = TRUE);
};

void MyClass::MyFunc(BOOL IsA)
{
    CMyObject &Object = A;
    if (!IsA)
        Object = &B;
}

Это меньше, чем elgant, но есть ли лучший способ сделать это, что я скучаю?

Редактировать: FWIW, причина для дополнительного параметра заключается в том, чтобы вывести некоторые связанные с состоянием элементы из рассматриваемого объекта, чтобы помочь многопоточности.

Ответы [ 2 ]

20 голосов
/ 19 февраля 2010

Как насчет:

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc()
   { 
     MyFunc(A); 
   }
   void MyFunc(CMyObject &Object);
};

4 голосов
/ 19 февраля 2010

Другой способ:

class MyClass
{
public:
   MyObject A,B;

   void MyFunc(MyObject MyClass::*myObject = &MyClass::A) {
       MyObject& obj = *(this->*myObject);
   }
};

Это делает невозможным даже передачу члена MyObject из другого экземпляра MyClass.Ваши три допустимых варианта вызова MyFunc: .MyFunc(), .MyFunc(&MyClass::A) и .MyFunc(&MyClass::B)

...