1

这是一个相当快速的问题。

我有一个功能:

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

? (我知道在后者中我必须稍微调整一下功能)

4

5 回答 5

1

不,不是,因为临时(您的char())不能绑定到非常量引用。由于您的要求,引用不能是 const(“读取 T 类型的值并将其分配给变量“值” ”)。

替代:

template<class T> T read()
{
    // Read an value of type T and assign it to variable "value"
    return T();
}

//...
c = read<char>();
于 2012-10-17T12:18:58.823 回答
1

不,你不能,而且可能也不想。您不能将临时值绑定到非常量引用参数。无论如何,返回值并分配给参数有什么用?这没有意义。

只需使用这个:

template<class T> T read()
{
    // Read an value of type T and assign it to variable "value"
    return value;
}

编辑:&从返回值中删除。

于 2012-10-17T12:21:01.973 回答
0

在您的模板中,您说您希望编译器拥有一个函数,该函数可以获取对类型的可编辑引用T并返回对该类型的可编辑引用,因此您可以将其用作 :char c; read( c );但您不能将其用作,read( char() )因为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;
}

然后你就可以打电话了char c = read<char>()

于 2012-10-17T12:25:35.437 回答
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 的类的成员。

谢谢您的帮助!

于 2012-10-17T12:32:37.923 回答
0

你给的第一个实际上没有意义。想想看,你传入一个匿名值,没有变量绑定到它。那你怎么能分配给它呢?会有什么改变?

由于char()是右值,因此不能将其用作非常量引用,而只能使用左值

在这种情况下,不需要一起引用。如果您想做您在问题中解释的内容,请尝试:

template<typename T>
T readT(){
  T v;
  read(v);
  return v;
}

现在我们可以输入:

char c = readT<char>();

哪个做你想要的。

于 2012-10-17T12:20:42.603 回答