Лучшее решение - просто сделать webView.loadUrl ("javascript: window.location.reload (true)");
. Это должно работать на всех версиях и не вводить новые записи истории.
Аргументы шаблона по умолчанию не являются частью сигнатуры шаблона (поэтому оба определения пытаются дважды определить один и тот же шаблон). Однако их типы параметров являются частью подписи. Таким образом, вы можете сделать
template <class T>
class check
{
public:
template< class U = T,
typename std::enable_if<std::is_same<U, int>::value, int>::type = 0>
inline static U readVal()
{
return BuffCheck.getInt();
}
template< class U = T,
typename std::enable_if<std::is_same<U, double>::value, int>::type = 0>
inline static U readVal()
{
return BuffCheck.getDouble();
}
};
Я знаю, что этот вопрос касается std::enable_if
, однако мне нравится предлагать альтернативное решение для решения одной и той же проблемы без enable_if. Для этого требуется C ++ 17
template <class T>
class check
{
public:
inline static T readVal()
{
if constexpr (std::is_same_v<T, int>)
return BuffCheck.getInt();
else if constexpr (std::is_same_v<T, double>)
return BuffCheck.getDouble();
}
};
Этот код выглядит скорее так, как если бы вы его записывали во время выполнения. Все ветви должны быть синтаксически правильными, однако семантика не обязательно должна быть. В этом случае, если T является int, getDouble не вызывает ошибок компиляции (или предупреждений), поскольку он не получает проверку / использование компилятором.
Если тип возвращаемой функции будет к сложному упоминанию, вы всегда можете использовать auto
как возвращаемый тип.
Проблема заключается в том, что компилятор видит 2 перегрузки одного и того же метода, оба из которых содержат одни и те же аргументы (в данном случае - нет) и одинаковое возвращаемое значение. Вы не можете предоставить такое определение. Самый чистый способ сделать это - использовать SFINAE для возвращаемого значения функции:
template <class T>
class check
{
public:
template< class U = T>
static typename std::enable_if<std::is_same<U, int>::value, U>::type readVal()
{
return BuffCheck.getInt();
}
template< class U = T>
static typename std::enable_if<std::is_same<U, double>::value, U>::type readVal()
{
return BuffCheck.getDouble();
}
};
Таким образом, вы предоставляете 2 разных перегрузки. Один возвращает int, другой возвращает double, и только один может быть создан с использованием некоторого T.
= 0
, который я написал, служит только для того, чтобы пользователь не передал сам0
(альтернативно, вы также можете написать...
вместо= 0
, который также не потребует аргументов, но по умолчанию используется пустой Я считаю, что это неясно, и мне нравится, что он лучше). Для SFINAE не требуется работать. Это также= 0
в обоих случаях, поэтому, если бы это было частью подписи, это не помогло бы различать в моем примере в любом случае =) – Johannes Schaub - litb 25 June 2016 в 07:26