Search code examples
c++ctor-initializer

Clean way of optionally including members in C++ ctor-initializer


If I have:

Class MyClass {
public:
    MyClass( /* args */ );
private:
    someType member0;
    someType member1;
    // ...
    someType memberN;
#if defined(FIRST_COMPILE_CONDITION)
    someType condition1Member0;
    someType condition1Member1;
    // ...
    someType condition1MemberN;
#endif
#if defined(SECOND_COMPILE_CONDITION)
    someType condition2Member0;
    someType condition2Member1;
    // ...
    someType condition2MemberN;
#endif
};

for some arbitrary number of compile conditions, is there a clean way to do the equivalent of this (especially for possibly multiple compile conditions), without putting some permanent member last?

MyClass::MyClass( /* args */ ) :
    member0( someValue ),
    member1( someValue ),
    // ...
    memberN( someValue ),
#if defined(FIRST_COMPILE_CONDITION)
    condition1Member0( someValue ),
    condition1Member1( someValue ),
    // ...
    condition1MemberN( someValue ),
#endif
#if defined(SECOND_COMPILE_CONDITION)
    condition2Member0( someValue ),
    condition2Member1( someValue ),
    // ...
    condition2MemberN( someValue ),
#endif
// ...
{
}

As the above will not compile under most conditions due to the trailing comma.

Edit to clarify:

It probably should be noted explicitly that someValue is intended to be a potentially independent, arbitrary value that may or may not depend on constructor arguments in each case used.


Solution

  • You can put the comma before initializers:

    MyClass::MyClass() :
         member0( someValue )
        ,member1( someValue )
        // ...
        , memberN( someValue )
    #if defined(FIRST_COMPILE_CONDITION)
        ,condition1Member0( someValue )
        ,condition1Member1( someValue )
        // ...
        ,condition1MemberN( someValue )
    #endif
    // ...
    {
    }