Я хочу иметь тип, который зависит от некоторого другого класса X, имеющего X :: value_type. Если внутри другого класса такого typedef нет, я хочу просто использовать X.
Поэтому я ищу код, подобный:
TypeChecker<X>::value_type // Here, value_type might be X or X::value_type, depending on X.
Но мои первоначальные попытки терпят неудачу, см. ниже:
Вот программа, которая не компилируется:
#include<type_traits>
template<typename T>
struct TypeChecker {
typedef typename std::conditional<
std::is_class<T>::value,
typename T::value_type, // I believe the error is due to this line (could be wrong)
T>::type value_type;
};
int main()
{
TypeChecker<int>::value_type x = 3;
return 0;
}
Она дает: error: 'int' is not a class, struct, or union type
Вы можете попробовать онлайн: Годболт ссылка
Я в замешательстве, потому что думал, что std::conditional
выберет правильную ветвь, но, похоже, в некотором смысле оценивает их обоих. По крайней мере, достаточно, чтобы вызвать ошибку компиляции.
Справка?