Templates: частичная компиляция
От: koenjihyakkei Россия  
Дата: 20.12.18 17:53
Оценка:
Есть код:

template<class T, const char Paren>
bool DeserializeObject(T& val)
{
    . . .
    if (Paren == ArrayParen)
    {
        Deserialize(val[i]);
    }
    else
    {
        Deserialize(val);
    }
    . . .
    return true;
}

template<class T>
typename std::enable_if<std::is_array<T>::value, bool>::type
    Deserialize(T& val)
{
    return DeserializeObject<T, ArrayParen>(val);
}

template<class T>
typename std::enable_if<!std::is_integral<T>::value && !std::is_array<T>::value, bool>::type
    Deserialize(T& val)
{
    return DeserializeObject<T, ObjectParen>(val);
}


Почему я так не могу делать? Почему компилятор требует, чтобы у объекта (то есть не массива) был оператор []? Он же находится в ветке условия для массива, то есть никогда не будет выполняется не для массива.
Я возможно не до конца понимаю, как происходит инстанциирование шаблона, но мне всегда казалось, что компилатор должен просто выкидывать те блоки, которые не будут выполняться под условием от константного шаболна, как при обычной условной компиляции на макросах.
Порой, этот С++ весьма раздражает, казалось бы хочу вполне обычного и логичного, ан нет, нельзя.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.