【问题标题】:Is there a way a function automatically detects data type of its arguments? (Please don't suggest function overloading)函数有没有办法自动检测其参数的数据类型? (请不要建议函数重载)
【发布时间】:2014-01-17 16:35:02
【问题描述】:

我正在尝试做的事情如下:

 (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 的值。

【问题讨论】:

    标签: c++ function type-conversion overloading


    【解决方案1】:

    你的意思是像一个模板?

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

    读一本书什么的。

    【讨论】:

    • Can T take int,unsigned long long,...like this data types here?
    • @UserCPP 可以;而这个答案最重要的部分是最后一句话。
    • @UserCPP 不,每种类型都有不同的功能
    • 是的,看来我只是在找这个。
    【解决方案2】:

    您可以使用模板来做到这一点。

    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
    }
    

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

    回复: UserCPP:有可能吗?模板 T function_name{....},平均函数不接受任何数据类型,在主函数中我写“variable = 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
    }
    

    推荐阅读:

    Function templates(具体来说,Argument Deduction in Function Templates

    【讨论】:

    • 有可能吗? template T function_name{....},平均函数不接受任何数据类型,在主函数中我写“variable = function_name()”
    • @UserCPP 我用答案编辑了我的帖子,简短的回答是否定的,但有一些选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多