接受所有类型作为函数中的参数

Accept all types as argument in function

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

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

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

我不确定你想要完成什么,但你可以传递一个 void 指针作为参数。

void foo(void* bar);

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

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

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

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

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

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

或者 and/or 此外,您可以提供函数 template,这是一种告诉编译器如何为任何特定类型生成函数的方法,例如

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

您可以使用更高级的技术,例如 SFINAE 来有效地重载这些模板函数,即为不同种类的类型使用不同的模板T(即整数类型、指针、内置类型、pod、 ETC)。然后,编译器将为它遇到的任何函数调用选择最合适的 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!
}