Dad*_*dyM 2 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;
}
};
Run Code Online (Sandbox Code Playgroud)
这个电话是错误的:
print<int>(2);
Run Code Online (Sandbox Code Playgroud)
错误信息:
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
Run Code Online (Sandbox Code Playgroud)
这个电话没有错误:
print<int> intPrinter;
intPrinter(2);
Run Code Online (Sandbox Code Playgroud)
我可以在没有实例化的情况下以某种方式使用函数对象吗?我不能在这里使用模板功能,因为我需要部分专业化功能.
我想你想说
print<int>()(2);
Run Code Online (Sandbox Code Playgroud)
这里,第一个parens print<int>通过调用(零参数)构造函数创建一个临时对象,然后第二个parens实际上调用该对象上的函数调用操作符.你现在得到的错误是由于这个事实造成的
print<int>(2);
Run Code Online (Sandbox Code Playgroud)
被解释为将2转换为a的类型转换表达式print<int>,这不是您想要的(并且也不合法).
希望这可以帮助!
对于那些无状态包装类,使用静态成员函数可能更好:
template<typename T, typename OutStream = std::ostream>
struct printer
{
static OutStream & print()(T const &toPrint, OutStream &outStream = std::cout)
{
outStream << toPrint;
return outStream;
}
};
Run Code Online (Sandbox Code Playgroud)
然后你可以用它来调用它们printer<Foo>::print(x);,你通常可以提供一个类型推导辅助函数模板:
template <typename T> std::ostream & print(T const & x)
{
return printer<T, std::ostream>::print(x);
}
Run Code Online (Sandbox Code Playgroud)
现在你可以说print(x);.