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

我可以在没有实例化的情况下以某种方式使用函数对象吗?我不能在这里使用模板函数,因为我需要部分专业化能力。

4

2 回答 2

6

我想你想说

print<int>()(2);

在这里,第一个括号print<int>通过调用(零参数)构造函数创建一个临时对象,然后第二个括号实际调用该对象上的函数调用运算符。您现在遇到的错误是由以下事实引起的

print<int>(2);

被解释为将 2 转换为 a 的类型转换表达式print<int>,这不是您想要的(也不合法)。

希望这可以帮助!

于 2012-02-05T19:49:13.400 回答
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);

于 2012-02-05T19:51:45.087 回答