我如何在C ++中使一个函数接受每个Object,所以我可以给它数字,字符串或其他对象。我在C ++方面表现不佳,我希望它不是一个完全愚蠢的问题......
编辑:好的,一个例子:如果你想尝试将std :: cout流包装成普通函数,那么该函数应该能够接受所有东西 - 从浮点数上的整数到复杂的对象。我希望现在更清楚了!
答案 0 :(得分:11)
您可以重载您的函数用于不同类型,即
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!
}
答案 1 :(得分:3)
您可以将模板用于此目的:
template <typename T>
void foo(T const & value)
{
// value is of some type T, which can be any type at all.
}
你可以用 来实际做什么,而不知道它的类型是有限的 - 它取决于你的功能的目标。 (如果有人试图用一个参数类型调用该函数,导致该函数特化形成不良,那么你的模板函数将无法实例化,这将是一个编译时错误。)
答案 2 :(得分:2)
我不确定您要完成的任务,但您可以将void指针作为参数传递。
void foo(void* bar);
答案 3 :(得分:1)
如果我理解正确,您可能想尝试使用模板http://en.cppreference.com/w/cpp/language/function_template
答案 4 :(得分:0)
您可能正在寻找模板 我建议你阅读this。