Почему вычет аргумента шаблона не работает здесь?

Это не быстрее к concat - Как smaclell указанный, проблемой является неизменная строка, вызывающая дополнительное выделение и перекопировавшая существующих данных.

+ "b" + "c" не быстрее, чтобы сделать со строковым разработчиком, но повторил, что concats с промежуточной строкой становится быстрее и быстрее, как # concat's становится больше как:

x = "a"; x + = "b"; x + = "c";...

24
задан BЈовић 18 January 2012 в 14:51
поделиться

3 ответа

Это похоже на невыявленный контекст. В соответствии со Стандартом C ++ 14.8.2.4/4:

Невыведенными контекстами являются:

  • спецификатор вложенного имени типа, который был указан с использованием квалифицированного идентификатора .
  • Тип, представляющий собой идентификатор-шаблона , в котором один или несколько аргументов-шаблонов являются выражением, которое ссылается на параметр-шаблона .

Когда имя типа указывается способом, который включает невыведенный контекст, все типы, составляющие это имя типа, также не выводятся. Однако составной тип может включать как выведенные, так и невыведенные типы. [ Пример : если тип указан как A :: B , оба T и T2 не выводятся . Аналогично, если тип указан как A < I + J> :: X , I , J и T не выводятся. Если тип указан как void f (typename A :: B, A ) , T в A :: B не выводится, но T в A выводится. ]

8
ответ дан 28 November 2019 в 23:34
поделиться

Удержание работает в прямом направлении:

template <class T> void f(T);

f(2); // can deduce int from T

Почему это происходит?

Это не работает в обратное направление (ваш пример):

template <class A> void g(typename S<A>::type);

Неужели так сложно увидеть, что аргументы шаблона являются значениями char и int?

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

Вы можете использовать что-то вроде (непроверено):

template <class SA> void h(SA a1)
{
    STATIC_ASSERT(same_type<SA, S<A>::type>::value);
    typedef typename SA::type A;

    ...
}

Использование вашей любимой статической библиотеки assert (у Boost их две).

5
ответ дан 28 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

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