Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
191 views
in Technique[技术] by (71.8m points)

怎么得到字符串对应的函数?

想做个单元测试函数,比如你调用test( "fun", " hello", "Hi")

程序,将会调用fun("hello"),然后跟"hi"比较。

这里的问题是,怎么从字符串"fun"得到函数fun。

注意,我这个测试函数希望可以通用,也就是说,任意个数参数的函数,任意返回值函数都能测试。


我这个问题的初衷,是想搞一些单元测试,测试函数的返回值和预期一样。C语言有个assert,不是函数,而是宏,可以简单调用:

assert(fun("hello") == "hi");

assert宏还不够好,打印出的信息是这样的:

Assertion failed: get_first_token("hello world") == "helalo", file MyGUI.cpp, li
ne 174

仅仅打印出了行号和执行的代码,但是我希望把函数调用的结果也打印出来,也就是get_first_token("hello world")的结果也打印出来,应该怎么改assert宏呢?

这是一个assert宏的实现:
https://www.bbsmax.com/A/Ae5R...

我搞了个更简单的:

#define MyAssert(a, b) {auto _t=a; if (_t!=b) {cout<<__FILE__<<", "<<__LINE__<<": 
Result of " <<#a << " is " <<_t <<" 
Expect: "<<b <<"
"; exit(1);}}

MyAssert(get_first_token("Hello world"), "hello")

这里主要用到了C++ 11之后auto关键字,自动推导类型,auto _t=a,展开后,实际上就会调用第一个参数,并把返回结果赋值给_t,然后和b比较,不等则打印出信息。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

c 语言是一种静态语言,所以不存在类似 js 那种把字符串转化成函数的用法。如果你希望这么用,就必须自己定义一个结构来自己管理。

struct str2func {
    char name[256];
    int (*func)(int a, int b);
};

int fun(int a, int b) { return a+b; }
int Hello(int a, int b) { return a+b; }
int Hi(int a, int b) { return a+b; }

str2func funclist[] = {
    { "fun", fun },
    { "Hello", Hello },
    { "Hi", Hi },
};

这种用法比较笨拙,而且函数的参数必须相同,否则你就得用强制函数指针转换,总之是一种不是很推荐得做法。

===========================================================
如果用宏的化,倒是可以实现你的想法:

#include <iostream>
#include <string>

using namespace std;

#define Test(result, func, ...) if (func(__VA_ARGS__) == result) { cout << "ok
"; } else { cout << "error
"; }

string fun(string instr) {
    if (instr == "hello")
        return "Hi";
    return "";
}

int main()
{
    Test("Hi", fun, "hello");    // 输出 ok
    Test("Hi", fun, "world");    // 输出 error
    return 0;
}

跟你需求唯一不同的地方在于,结果放在了第一个,参数放最后。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...