Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以不实例化地使用函数对象吗?_C++_Templates_Constructor_Function Object - Fatal编程技术网

C++ 我可以不实例化地使用函数对象吗?

C++ 我可以不实例化地使用函数对象吗?,c++,templates,constructor,function-object,C++,Templates,Constructor,Function Object,具有以下代码: template<typename T, typename OutStream = std::ostream> struct print { OutStream &operator()(T const &toPrint, OutStream &outStream = std::cout) const { outStream << toPrint; return outStream; } }; 模板结构打印{

具有以下代码:

template<typename T, typename OutStream = std::ostream> struct print {
  OutStream &operator()(T const &toPrint, OutStream &outStream = std::cout) const {
    outStream << toPrint;
    return outStream;
  }
};
模板结构打印{
超出流和运算符()(T常量和toPrint,超出流和超出流=std::cout)常量{
扩展main.cpp(38):错误C2440:'':无法从“int”转换为“print”
1> 与
1>          [
1> T=int
1>          ]
1> 没有构造函数可以采用源类型,或者构造函数重载解析不明确
此呼叫没有错误:

print<int>(2);
print<int> intPrinter;
intPrinter(2);
打印打印机;
打印机(2);
我可以在没有实例化的情况下使用函数对象吗?
我不能在这里使用模板函数,因为我需要部分专门化功能。

我想你应该说

print<int>()(2);
print()(2);
在这里,第一个参数通过调用(零参数)构造函数创建一个临时
print
对象,然后第二个参数实际调用该对象上的函数调用操作符

print<int>(2);
print(2);
被解释为将2转换为
打印
,这不是您想要的(也不合法)


希望这有帮助!

对于那些无状态包装器类,最好使用静态成员函数:

template<typename T, typename OutStream = std::ostream>
struct printer
{
    static OutStream & print()(T const &toPrint, OutStream &outStream = std::cout)
    {
        outStream << toPrint;
        return outStream;
    }
};
模板
结构打印机
{
静态外扩和打印()(T const和toPrint,外扩和外扩=std::cout)
{

扩展+1谢谢。太好了。你的答案非常有用,现在我只能选择答案了…@DaddyM:选择你觉得最有用的。不用担心:-)这是提供一组不需要状态的函数的标准习惯用法(比如你在函子对象中拥有的)标准库中的char_traits类是一个很好的具体示例,它们为字符串和流的不同字符类型提供了所有具体行为。
template<typename T, typename OutStream = std::ostream>
struct printer
{
    static OutStream & print()(T const &toPrint, OutStream &outStream = std::cout)
    {
        outStream << toPrint;
        return outStream;
    }
};
template <typename T> std::ostream & print(T const & x)
{
    return printer<T, std::ostream>::print(x);
}