这是一个很快的问题。
我有一个功能:
template<class T> T& read(T& value)
{
// Read an value of type T and assign it to variable "value"
return value;
}
现在我可以使用以下函数:
char c;
read(c);
但我想将此功能用作:
char c = read(char());
这是可能的,还是我必须将其用作:
char c = read<char>();
? (我知道后者我必须稍微调整一下这个功能)
答案 0 :(得分:1)
不,不是,因为临时(您的char()
)无法绑定到非const引用。由于您的要求,引用不能是const(“读取类型T的值并将其分配给变量”value“”)。
替代方案:
template<class T> T read()
{
// Read an value of type T and assign it to variable "value"
return T();
}
//...
c = read<char>();
答案 1 :(得分:1)
不,你不能,也可能不想。您不能将临时绑定到非const引用参数。无论如何,返回值和分配参数的用途是什么?这没有意义。
请使用:
template<class T> T read()
{
// Read an value of type T and assign it to variable "value"
return value;
}
编辑:从返回值中删除了&
。
答案 2 :(得分:0)
你给的第一个实际上没有意义。想一想,你传入一个匿名值,没有变量绑定到它。你怎么能分配呢?什么会改变?
由于char()
是一个右值,你不能将它用作非const引用,只能用左值
在这种情况下,不需要一起引用。如果你想做你在问题中解释的内容,请尝试:
template<typename T>
T readT(){
T v;
read(v);
return v;
}
现在我们可以输入:
char c = readT<char>();
你想做什么。
答案 3 :(得分:0)
在模板中,您说您希望编译器中有一个函数可以获得对T
类型的可编辑引用,并返回对该类型的可编辑引用,因此您可以将其用作:{{1但是你不能将它用作char c; read( c );
,因为read( char() )
不可编辑(l值),因为你不能在等于运算符的左侧使用它:char()
是无效的。如果您不想更改输入,可以使用以下内容:
char() = 3
然后你可以把它称为:
template< class T >
T read( const T& val ) {
// do something with val and return a T
return val;
}
如果你想要一个默认值,那么就像前面的例子一样简单:
read( char() );
read (char)1 );
char c = read( (char)2 );
read( c );
然后您就可以致电template< class T >
T read( const T& val = T() ) {
// do something with val and return a T
return val;
}
答案 4 :(得分:0)
好的,感谢您的评论,我注意到并非所有人都能理解我的问题。但有些人做了,在我们的帮助下,我现在有了这两个类功能:
template<class T> void read(T& value)
{
event::deserialize(value, *this);
}
template<class T> T read()
{
T temp;
event::deserialize(temp, *this);
return temp;
}
请注意,这些函数是名为Stream的类的成员。
感谢您的帮助!