template <typename T>
void now_works(vector<std::string>& vs, vector<double>& vd, vector<T>& inp) {
if constexpr (std::is_same<T, double>::value)
vd.push_back(inp[0]);
else if constexpr (std::is_same<T, std::string>::value)
vs.push_back(inp[0]); // Line 18: no error
}
ваша проблема в том, что все ветви компилируются, даже если они не запускаются.
if constexpr
делает их компилированными, а затем отбрасывает их во время компиляции, игнорируя любые ошибки типа.
Код, который работал, все могло конвертировать, даже если он не был запущен, поэтому он компилировался.
Код, который не работал, преобразование, которое вы хотели исключить, является недопустимым, поэтому он потерпел неудачу во время компиляции.
Обратите внимание, что if constexpr
работает только потому, что условие ветвления является константой времени компиляции, а также потому, что оно находится в шаблоне, и это предложение зависит от параметров шаблона, и недопустимый код такжезависит от параметров шаблона.
Если у вас еще нет if constexpr
, потому что вы застряли на старой версии C ++, вы будете вынуждены делать что-то уродливое, например диспетчеризацию тегов или SFINAE с помощью вспомогательных функций иличто-то более загадочное.