std :: enable_if условно компилировать конструктор [duplicate]

Лучшее решение - просто сделать webView.loadUrl ("javascript: window.location.reload (true)"); . Это должно работать на всех версиях и не вводить новые записи истории.

28
задан Loïc Février 15 June 2012 в 19:01
поделиться

3 ответа

Аргументы шаблона по умолчанию не являются частью сигнатуры шаблона (поэтому оба определения пытаются дважды определить один и тот же шаблон). Однако их типы параметров являются частью подписи. Таким образом, вы можете сделать

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();
   }
};
32
ответ дан Johannes Schaub - litb 15 August 2018 в 21:25
поделиться
  • 1
    +1, я думаю, что это выглядит намного чище, чем другой подход. – ildjarn 15 June 2012 в 20:19
  • 2
    Довольно умное решение! – plasmacel 17 September 2015 в 20:51
  • 3
    Таким образом, параметр шаблона типа по умолчанию (который имеет тип по умолчанию) не является частью сигнатуры шаблона, но параметр шаблона по умолчанию, не являющийся типом (с постоянным значением по умолчанию). Это верно? – Alan 24 June 2016 в 19:42
  • 4
    @Alan это неверно. оба они не являются частью подписи. = 0, который я написал, служит только для того, чтобы пользователь не передал сам 0 (альтернативно, вы также можете написать ... вместо = 0, который также не потребует аргументов, но по умолчанию используется пустой Я считаю, что это неясно, и мне нравится, что он лучше). Для SFINAE не требуется работать. Это также = 0 в обоих случаях, поэтому, если бы это было частью подписи, это не помогло бы различать в моем примере в любом случае =) – Johannes Schaub - litb 25 June 2016 в 07:26
  • 5
    @ JohannesSchaub-litb, это параметр непигового шаблона со значением по умолчанию 0, который является частью подписи. нет? – pepero 10 September 2017 в 21:37

Я знаю, что этот вопрос касается 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 как возвращаемый тип.

0
ответ дан JVApen 15 August 2018 в 21:25
поделиться

Проблема заключается в том, что компилятор видит 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.

7
ответ дан mfontanini 15 August 2018 в 21:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: