Получить значение по умолчанию для инициализированного в классе члена

Есть ли способ прямого получения значения по умолчанию для члена, который был определен с помощью инициализации в классе? Например:

struct Test
{
    int someValue = 5;
};

int main(int argc,char *argv[])
{
    auto val = declvalue(Test::someValue); // Something like this; Should return 5
    std::cout<<val<<std::endl;
    for(;;);
    return 0;
}

В основном это то, что "копирует" (аналогично decltype) всю декларацию, включая значение по умолчанию. Существует ли что-то подобное?

1 ответ

Решение

Если ваш тип является конструируемым по умолчанию, вы можете написать свой собственный declvalue:

template<typename T, typename C>
constexpr T declvalue(T C::* ptr)
{
    return C{}.*ptr;
}

который будет использоваться следующим образом:

int main() {
    cout << declvalue(&Test::someValue) << endl;
}

живое демо

Этот конкретный случай, похоже, хорошо оптимизируется, но я предлагаю осторожность.

Другие вопросы по тегам