Я создал шаблонный класс, который выводит значения на основе их типов данных, то есть long получает вывод в виде целого числа со знаком (десятичное число), тогда как RESULT
получает вывод в шестнадцатеричном формате. Я определил RESULT
как:
typdef long RESULT.
Это не работает правильно, потому что RESULT
рассматривается как long
а также RESULT
Выходная подпрограмма никогда не вызывается (вместо long
рутина называется). Есть ли обходной путь для этого?
То, что вы хотите, не будет работать по указанным причинам.
Как насчет простого добавления объекта Function, который форматирует вывод, как вы хотите.
class A {
template< typename T>
std::string output(long val) {return T(val)}
}
struct decimal {
std::string operator()(long val) {//return decimal}
}
struct hex {
std::string operator()(long val) {//return hex}
}
Пример использования:
A a;
cout << a.output<decimal>(10) << endl;
cout << a.output<hex>(10) << endl;
Это ожидается.
Определение типа не изменяет то, как компилятор видит тип — оно создает новое имя для типа, в данном случае RESULT, и, поскольку он того же типа, он ведет себя и использует тот же код, что и указанный тип, в этом дело длинное
typedef
объявляет только alias
для типа. Вы можете использовать некоторыеtemplate magic
«для вашего примера.
template<typename T, int I>
struct true_typedef
{
explicit true_typedef(const T& val):value(val) { }
T value;
};
typedef true_typedef<long, 0> RESULT;
пример.
http://liveworkspace.org/code/1fc907ae5cddc23bd7d9545cfafa8a05