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