一道不知如何下手的C++问题

int main(){
printf("1:");
int i = CRO();
printf("2:");
float f = CRO();
printf("3:");
void p = CRO();
printf("4:");
CRO();
}
程序输出为:
1:int
2:float
3: void

4:void

请设计一个CRO()满足以上输出。

呵呵,这样行不行!

#include "stdafx.h"
#include <iostream>

using namespace std;

struct CRO 
{
  #define void void *

  CRO() { type_ = "void"; }
  ~CRO() { cout << type_.c_str() << endl; }
  operator int() { type_ = "int"; return 0; }
  operator float() { type_ = "float"; return 0.0; }
  operator void () { type_ = "void"; return 0; }
private:
  string type_;
};

int main()
{
  printf("1:");
  int i = CRO();
  printf("2:");
  float f = CRO();
  printf("3:");
  void p = CRO();
  printf("4:");
  CRO();
  system("PAUSE");
  return 0;
}

可以使用强制转换运算符的重载来实现前面3个。
最后一个void,本来是想在关闭RVO的情况下用拷贝构造函数实现 ,但是会影响到前三个的输出,所以还是没想到啥好方法。


#include <stdio.h>

class CRetType
{
public:
    operator int()
    {
        printf("int\n");
        return 0;
    }

    operator float()
    {
        printf("float\n");
        return 0.f;
    }

    operator void*()
    {
        printf("void*\n");
        return nullptr;
    }
};

CRetType CRO()
{
    return CRetType();
}

int main() {
    printf("1:");
    int i = CRO();
    printf("2:");
    float f = CRO();
    printf("3:");
    void* p = CRO();
    printf("4:");
    CRO();

    return 0;
}

你的代码首先都不对,printf("1:)";,这里括号在引号里面,根本不能编译。

哎呀我输入错误,你应该知道什么意思吧引号就在里面的。

 #include "stdafx.h"
#include <iostream>
using namespace std;

char *pa[] = { "int", "float", "void *", "void" };
int pa1 = 0;

#define CRO() (printf("%s\n", pa[pa1++]), NULL)

int _tmain(int argc, _TCHAR* argv[])
{
printf("1:");
int i = CRO();
printf("2:");
float f = CRO();
printf("3:");
void * p = CRO();
printf("4:");
CRO();
}

1:int
2:float
3:void *
4:void
Press any key to continue . . .

如果用void CRO(),可能在一些编译器上可以,但是在我的VC++2010上不行。

看你写了 rtti,但是我觉得C++编译器不可能在运行的时候得到返回值接收者的类型,除非有debug版的hacking

图片说明

你可以看下,函数的调用,是先对函数求值,再传给返回值的。换言之,在函数内根本不可能得知“未来”发生了什么,也就是它的结果送到哪里去。

如是面试题,考官可能想考如下两点:
1、考核C++函数中“多态”的定义。
要求面试者解释什么时函数的多态,并且明确告知返回值不能做为多态的定义。
如再深入一点,则解释多态是如何实现的,为何编译实现时不能使用返回值做为多态的要素之一。

2、考核硬是不能实现时,程序员如何办。
要求面试者碰到这种问题时怎么办。从需求、限制等多方面解释。

这不是一个函数,这是四个同名函数。
你说:int f(void); 和 float f(void)是一个函数是吗?

或者这么说这个是重载,虽然名字相同,但是对应不同的函数。比如:calss A {int f(); float f() .....}

难道你想预知返回值类型?那void p是什么鬼?

其实没必要想得那么复杂。题目并非要求了你的CRO();返回的必须是前方定义的类型,这里可以用最笨的方式解决就是我们初学时做题的思路,一个个输出,比如CRO();这个函数的用处就是第一次执行时输出int,第二次输出float,第三次输出void,第四次输出void。
或许有人说这种方式有点弱智,但是只是要满足题目的话无论什么方法都是可以接受的。