Это не быстрее к concat - Как smaclell указанный, проблемой является неизменная строка, вызывающая дополнительное выделение и перекопировавшая существующих данных.
+ "b" + "c" не быстрее, чтобы сделать со строковым разработчиком, но повторил, что concats с промежуточной строкой становится быстрее и быстрее, как # concat's становится больше как:
x = "a"; x + = "b"; x + = "c";...
Как и в первом примечании, имя типа используется, когда вы упоминаете иждивенец имя. Так что здесь он вам не нужен.
template <class T>
struct S
{
typedef T& type;
};
Что касается создания экземпляра шаблона, проблема в том, что typename S :: type
характеризует невыведенный контекст для A. Когда a параметр шаблона используется только в невыявленном контексте (случай A в ваших функциях) it ' s не принимается во внимание при выводе аргумента шаблона. Подробности см. В разделе 14.8.2.4 стандарта C ++ (2003).
Чтобы ваш вызов работал, вам необходимо явно указать тип:
temp<char>(c);
Это похоже на невыявленный контекст. В соответствии со Стандартом 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
выводится. ]
Удержание работает в прямом направлении:
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 их две).