我如何通过定义(#define SOME_DEFINE)作为函数的参数?

时间:2019-05-04 14:56:02

标签: c++

好吧,我尝试了语言功能,但没有找到方法,如何将定义作为参数传递给函数。 我知道,这不是最佳实践,只是纯粹的兴趣所在。

我已经尝试了几种方法,至少泛型没有帮助。

所以,我想做的是:

static mut

感谢您。

1 个答案:

答案 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 ++库中有很多使用模板函数的函数。