"Отметьте свои ответы с принятием для помещения кода в проект Codeplex".
, Почему? Весь Материал на этом сайте под CC-by-sa-2.5, поэтому просто подвергает Ваш Дополнительный Проект переполнения той же лицензии, и можно свободно использовать его.
Так или иначе, вот Строка. Обратная функция, на основе этот вопрос .
///
/// Reverse a String
///
/// The string to Reverse
/// The reversed String
public static string Reverse(this string input)
{
char[] array = input.ToCharArray();
Array.Reverse(array);
return new string(array);
}
Это синтаксис для специализации шаблона частичного класса:
template<typename T>
struct numeric_type_traits // basic template
{
typedef T type_t;
typedef T scalar_t;
};
template<typename T>
struct numeric_type_traits< vec3<T> > // partial specialisation for vec3's
{
typedef vec3<T> type_t;
typedef T scalar_t;
};
И так далее, например:
template <typename T, typename T_Alloc>
struct numeric_type_traits< std::vector<T,T_Alloc> > // part. spec. for std::vector
{
typedef std::vector<T,T_Alloc> type_t; // deal with custom allocators, too
typedef T scalar_t;
};
Может быть, вам следует создать экземпляр вашего шаблона с двумя типами? См .:
template<typename TYPE, typename SCALAR>
struct numeric_type_traits_c
{
typedef TYPE type_t;
typedef SCALAR scalar_t;
};
typedef numeric_type_traits_c<int,int> int_type_traits;
typedef numeric_type_traits_c<vec3<int>, vec3<int>::type_t> vec3_type_traits;
template<typename T>
struct numeric_type_traits_c
{
typedef T type_t;
typedef T scalar_t;
};
template<typename T>
struct numeric_type_traits_c<vec3<T> >
{
typedef vec3<T> type_t;
typedef typename vec3<T>::type_t scalar_t;
};
Да, конечно, я ошибся в type_t вместо vec3!
Интересное замечание здесь заключается в применении знаний, которые мы получили от динамического полиморфизма к полиморфизму «функция типа».
Если вы сравните эту функцию f:
struct I { virtual double f()const = 0; }; // C++ version of 'an interface'
struct A : public I { virtual double f()const{ return 0; } };
struct B : public I { virtual double f()const{ return 1; } };
struct C { };
void f( const I& i ){ return I.f(); }
f( A() );
f( C() ); // compiler warning: wrong type provided.
с этой функцией f:
// struct TI { typedef ??? iT; }; // no C++ version of a type-interface
struct TA { typedef int iT; };
struct TB { typedef double iT; };
struct TC { };
template< typename aTI > struct fT { typedef aTI::iT returnType; };
fT< TA >::returnType vA;
ft< C >::returnType vC; // compiler error: C has no iT member.
Вы видите, что единственное отличие - это обозначение параметров. Первая функция - это «обычная» полиморфная функция. Компилятор предупредит нас, если предоставленный аргумент имеет неправильный тип.
fT - это функция, которую может использовать только компилятор для определения определенного типа. В качестве аргумента требуется тип. Но в языке нет «концепции» ограничения типа (пока - см. «Концепции в C ++ 0x»). Поэтому нам нужно вручную гарантировать, что типы, которые мы используем для функции типа, «реализуют» правильный интерфейс.
Конкретно это сводится к добавлению типа scalar_t
к любому классу, который вы хотите использовать с функцией типа numeric_type_traits_c
.