如何将定义(#define some_define)作为函数的参数传递

How can i pass define (#define SOME_DEFINE) as parameter of the function?

本文关键字:函数 参数传递 define 定义 some #define      更新时间:2023-10-16

好吧,我已经尝试了语言特征,但没有找到方法,我该如何将定义传递给函数作为param。我知道,这不是最好的做法,而只是纯粹的兴趣。

我已经尝试通过多种方式进行操作,至少仿制药没有帮助。

所以,我想做的是:

#define SOME_DEFINE
template <class T>
void foo(T param)
{
    if(param == SOME_DEFINE) do stuff
}
int main
{
    foo(SOME_DEFINE);
}

感谢您。

所缺少的只是您定义的值。

只需添加它,您就可以开始测试该功能。

#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 = AreEqual<T>>
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 库中使用模板功能有很多功能。