好吧,我尝试了语言功能,但没有找到方法,如何将定义作为参数传递给函数。 我知道,这不是最佳实践,只是纯粹的兴趣所在。
我已经尝试了几种方法,至少泛型没有帮助。
所以,我想做的是:
static mut
感谢您。
答案 0 :(得分:0)
所缺少的只是您定义的值。
只需添加它,即可开始测试功能。
#include <iostream>
#define SOME_DEFINE 42
void do_all_the_things() {
std::cout << "woohoo!" << std::endl;
}
void do_none_of_the_things() {
std::cout << "darn" << std::endl;
}
template <class T>
void foo(T param) {
if (param == SOME_DEFINE) {
do_all_the_things();
} else {
do_none_of_the_things();
}
}
int main() {
foo(42);
foo(3);
return 0;
}
对于字符串,它有点复杂。
字符串文字const char*
很难比较。
例如:
const char* a = "value a";
const char* b = "value b";
return a == b;
看似可行,但实际上只是比较指针而不是内容。您可以通过将宏定义为std::string("an example value")
或使用专门的比较功能来解决此问题。
#include <iostream>
#include <cstring>
#define SOME_DEFINE "test value"
void do_all_the_things() {
std:cout << "woohoo!" << std::endl;
}
void do_none_of_the_things() {
std::cout << "dang it" << std::endl;
}
template <class T>
struct AreEqual final {
bool operator () (T a, T b) const {
return a == b;
}
};
template <>
struct AreEqual<const char*> final {
bool operator () (const char* a, const char* b) const {
return std::strcmp(a, b) == 0;
}
};
template <class T, class AreEqualTo = DefaultEqualTo>
void foo(T param, AreEqualTo are_equal_to = AreEqualTo()) {
if (are_equal_to(param, SOME_DEFINE)) {
do_all_the_things();
} else {
do_none_of_the_things();
}
}
int main() {
foo("test");
foo("test value");
return 0;
}
这是探索您是否正在学习该语言的另一条值得的途径。 C ++库中有很多使用模板函数的函数。