Могу ли я использовать функциональный объект без создания экземпляров? - PullRequest
2 голосов
/ 05 февраля 2012

Имея следующий код:

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);

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

Ответы [ 2 ]

6 голосов
/ 05 февраля 2012

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

print<int>()(2);

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

print<int>(2);

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

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

5 голосов
/ 05 февраля 2012

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

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);.

...