Спецификатор класса хранения является частью объявления объекта и не является частью типа объекта.
Следовательно, его нельзя использовать там, где ожидается тип.
Расширяя предложение по специализации 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.