Это невозможно. Обычный способ сделать это так:
template<int N>
struct foo {
static const int value = N;
};
и для типов
template<typename T>
struct foo {
typedef T type;
};
Вы можете получить к нему доступ как foo<39>::value
или foo<int>::type
.
Если у вас есть определенный тип, вы можете использовать частичную специализацию шаблона:
template<typename>
struct steal_it;
template<std::size_t N>
struct steal_it< std::bitset<N> > {
static const std::size_t value = N;
};
Тот же принцип возможен и для параметров типа. Теперь вы можете передать ему любой битовый набор, например steal_it< std::bitset<16> >::value
(обратите внимание на использование size_t, а не int!). Поскольку у нас пока нет большого числа параметров шаблона с переменным числом переменных, мы должны ограничиться определенным количеством параметров и повторить специализации шаблона steal_it для счетчика от 1 до N. Другая сложность заключается в сканировании типов, которые имеют смешанные параметры (типы и не Типы параметров). Это, вероятно, нетривиально решить.
Если у вас есть не тип, а только его объект, вы можете использовать трюк для получения значения во время компиляции:
template<typename T>
char (& getN(T const &) )[steal_it<T>::value];
int main() {
std::bitset<16> b;
sizeof getN(b); // assuming you don't know the type, you can use the object
}
Хитрость заключается в том, чтобы шаблон функции автоматически определял тип, а затем возвращал ссылку на массив символов. Функция не должна быть определена, нужен только ее тип.