2012-02-05 2 views
2

Имея следующий код:Могу ли я использовать объект функции без создания экземпляра?

template<typename T, typename OutStream = std::ostream> struct print { 
    OutStream &operator()(T const &toPrint, OutStream &outStream = std::cout) const { 
    outStream << toPrint; 
    return outStream; 
    } 
}; 

Этот вызов является ошибочным: сообщение

print<int>(2); 

Ошибка:

1>main.cpp(38): error C2440: '<function-style-cast>' : cannot convert from 'int' to 'print<T>' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous 

Этот вызов не является ошибочным:

print<int> intPrinter; 
intPrinter(2); 

Можно ли каким-либо образом использовать объект функции без его создания? Здесь я не могу использовать функцию шаблона, потому что мне нужны частичные возможности специализации.

ответ

6

Я думаю, что вы хотите сказать

print<int>()(2); 

Здесь первые круглые скобки создают временный print<int> объект путем вызова (нулевой аргумент) конструктор, то вторые круглые скобки на самом деле вызвать оператор вызова функции на том, что объект. Ошибка вы получаете сейчас вызвана тем, что

print<int>(2); 

интерпретируется как выражение напечатанного материала для превращения 2 в print<int>, который не то, что вы хотите (а также не является законным).

Надеюсь, это поможет!

+0

Ты замечательный. Благодаря! – DaddyM

5

Для тех апатридов классов обертки, это может быть лучше использовать статические функции:

template<typename T, typename OutStream = std::ostream> 
struct printer 
{ 
    static OutStream & print()(T const &toPrint, OutStream &outStream = std::cout) 
    { 
     outStream << toPrint; 
     return outStream; 
    } 
}; 

Затем вы можете вызвать их с printer<Foo>::print(x);, и вы можете обычно поставить шаблон вспомогательной функции типа-выводящий:

template <typename T> std::ostream & print(T const & x) 
{ 
    return printer<T, std::ostream>::print(x); 
} 

Теперь вы можете просто сказать print(x);.

+0

+1 Спасибо. Здорово. Ваш ответ очень полезен, и теперь я застрял в выборе ответа ... – DaddyM

+0

@DaddyM: выберите то, что вы чувствуете, поможет вам больше всего. Не стоит беспокоиться :-) –

+0

Это стандартная идиома для предоставления набора функций, которые не требуют состояния (например, у вас в объекте-функторе) для шаблона, специализированного по типу. Классы char_traits в стандартной библиотеке являются отличным конкретным примером - они обеспечивают все конкретное поведение для разных типов символов для строк и потоков. – aalpern

Смежные вопросы