函数有没有办法自动检测其参数的数据类型?(请不要建议函数重载)

Is there a way a function automatically detects data type of its arguments? (Please don't suggest function overloading)

本文关键字:函数 重载 数据类型 有没有 自动检测 参数      更新时间:2023-10-16

我要做的是:

 (some data type say x) function_name((same data type x mentioned earlier) variable_name) 
 {
 /* Function body */
 }
 int main()
 {
 (data type x mentioned above) var;
 function_name(var);
 .....
 }

例如,我有

 int function_name(int x)
 int main()
 {
 int y;
 function_name(y);
 ....}

在main()中,我通过上面的函数传递一个int变量 现在我想要另一个与上述函数完全相同的函数,但只是参数的数据类型和返回类型不同,比如

unsigned long long FUNCTION_NAME_SAME_DEFINITION_AS_function_name(unsigned long long x)

有没有办法在不使用函数重载的情况下合并上述两个函数?意味着函数检测通过它传递的变量的数据类型?如果我传递类型 1 的参数,它返回数据类型 1 的值,如果我传递类型 2 的参数,它返回数据类型 2 的值。

你的意思是像模板?

template <typename T>
T function_name(T variable_name) 
{
    /* Function body */
}

读一本书什么的。

您可以使用模板执行此操作。

template <typename T>
T function_name(T var) {
    // code
}
int main() {
    int foo;
    char bar;
    function_name(foo); // returns int
    function_name(bar); // returns char
}

编译器将尝试使用可用模板定义进行各种类型组合,以输出有效函数。 如果成功,它将生成具有该类型的完整函数定义。

回复: 用户CPP: 可能吗? 模板 T function_name{....}, 平均函数不接受数据类型,在主函数中我写"变量 = function_name()"

这直接是不可能的。 函数模板只能从参数推断类型,而不能从返回值推断类型。 你有一些选择。 您可以通过引用进行修改,而不是返回值:

template <typename T>
void function_name(T& var) {
    // code
}
int main() {
    int foo;
    char bar;
    function_name(foo); // modifies foo as an int
    function_name(bar); // modifies bar as a char
}

您还可以显式声明类型:

template <typename T>
T function_name() {
    // code
}
int main() {
    int foo;
    char bar;
    foo = function_name<int>();  // returns int
    bar = function_name<char>(); // returns char
}

推荐阅读:

函数模板

(特别是函数模板中的参数推导)