Класс условного хранения зависит от параметра шаблона - PullRequest
0 голосов
/ 19 апреля 2020

Следующее не является действительным c ++ (-std=c++2a). Я хочу изменить класс хранения var на основе параметра шаблона b:

#include <type_traits>

template <bool b>
void f() {
  typename std::conditional<b, static int, int>::type var;
}

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Спецификатор класса хранения является частью объявления объекта и не является частью типа объекта.

Следовательно, его нельзя использовать там, где ожидается тип.

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

template<bool b> struct A;

template<> struct A<true> {
    inline static int var = 0;
};

template<> struct A<false> {
    int var = 0;
};

template <bool b>
void f() {
    A<b> a;
    int& var = a.var;
    do_something_with(var);
}

Имейте в виду, что семантика при этом совершенно иная - одна создается в автоматизированном хранилище c для каждый вызов, другой инициализируется один раз и распределяется между вызовами. В многопоточной среде первое безопасно, а второе - нет, et c.

1 голос
/ 19 апреля 2020

Вы можете предоставить полную специализацию f, например:

template <bool b> void f();

template <> void f<true>()
{
  static int var;
}

template <> void f<false>()
{
  int var;
}

Это должно иметь тот же эффект, что и вы пытаетесь достичь.

...