Не статические участники как параметры по умолчанию в C++

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

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, причина дополнительного параметра состоит в том, чтобы воплотить некоторых связанных с состоянием участников от рассматриваемого объекта помочь многопоточности.

15
задан Community 23 May 2017 в 11:47
поделиться

2 ответа

Как насчет :

class MyClass
{
public:
   CMyObject A,B;

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

?

20
ответ дан 1 December 2019 в 03:04
поделиться

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

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)

4
ответ дан 1 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: