【问题标题】:Accept all types as argument in function接受所有类型作为函数中的参数
【发布时间】:2015-03-21 17:20:09
【问题描述】:

如何在 C++ 中让函数接受每个对象,这样我就可以给它数字、字符串或其他对象。我的 C++ 不太好,我希望这不是一个完全愚蠢的问题...

编辑:好的,举个例子:如果您想尝试将 std::cout 流包装到普通函数中,该函数应该能够接受所有内容 - 从整数到浮点数到复杂对象。我希望现在更清楚了!

【问题讨论】:

  • 你能举个例子说明你想做什么吗?
  • 答案可能涉及模板...

标签: c++ arguments


【解决方案1】:

您可以为不同类型重载您的函数,即

size_t func(int);
size_t func(std::string);

另外和/或另外,您可以提供一个函数模板,这是一种告诉编译器如何为任何特定类型生成函数的方法,例如

template<typename T>
size_t func(T const&) { return sizeof(T); }

您可以使用更高级的技术(例如 SFINAE)来有效地重载这些模板函数,即为不同类型的类型使用不同的模板T(即整数类型、指针、内置类型、pod 等)。然后编译器将为它遇到的任何函数调用选择最合适的func()(如果有),如果这是一个模板,则生成一个适当的函数。 这不需要重新编码。

一种完全不同的方法是使用通用的擦除类型,例如boost::any,当函数需要在编码时(而不是编译时)解析预期的类型:

size_t func(boost::any const&x)
{
  auto i = boost::any_cast<const int*>(x);
  if(i) return func(*i);
  // etc for other types, but this must be done at coding time!
}

【讨论】:

  • 从C++20开始,也可以infer parameter types using auto
  • “编码时间”!?你的意思是“运行时”,对吧?
  • @AlexisWilke 我实际上是指编码时间。关键是当程序在运行时解析类型时,处理可能类型的代码必须在每个可能的时间进行编码,这发生在编码时。
【解决方案2】:

您可以为此目的使用模板:

template <typename T>
void foo(T const & value)
{
    // value is of some type T, which can be any type at all.
}

在不知道它的类型的情况下,您实际上可以使用该值可能做些什么——这取决于您的函数的目标。 (如果有人尝试使用导致该函数特化格式错误的参数类型调用该函数,那么您的模板函数将无法实例化,这将是一个编译时错误。)

【讨论】:

    【解决方案3】:

    如果我理解正确,您可能想尝试使用模板 http://en.cppreference.com/w/cpp/language/function_template

    【讨论】:

      【解决方案4】:

      我不确定您要完成什么,但您可以将 void 指针作为参数传递。

      void foo(void* bar);
      

      【讨论】:

      • 使用 void * 在现代 C++ 中很少是答案。
      • 我同意。正如其他人所说,我可能应该提供一个模板示例。
      【解决方案5】:

      您可能正在寻找模板
      我建议你阅读this

      【讨论】:

        猜你喜欢
        • 2021-03-29
        • 1970-01-01
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        相关资源
        最近更新 更多