如何在C ++中接收任何类型的函数参数并获取函数内部传递的变量的类型?

Adr*_*gru 4 c++

我希望能够为函数的参数接收任何类型,并在函数内部确定给定类型并采取相应措施。

伪代码:

void myFunction(any argument)
{
   if(argument is int)
   {
      myFunctionInt(argument);
   }
   if(argument is string)
   {
      myFunctionString(argument);
   }
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

Sta*_*nny 5

首先,您应该看一下简单的函数重载,它使您可以在老式的方法中实现它:

void my_function(int value) {
    std::cout << "int\n";
}

void my_function(std::string value) {
    std::cout << "string\n";
}
Run Code Online (Sandbox Code Playgroud)

尽管这样做有一些缺点,但它需要花费很多行代码(每种类型都有一个新函数!)。您还需要特别指定类型(使用所有限定词),这可能是不希望的。


为了遵循您的伪代码,在使用C ++ 17时,可以if-constexpr在编译时选择正确的分支。

太好了,因为您甚至可以value.length()std::string分支机构内说类似的话!对于常规的old,这是不可能的if

那么如何确定是什么类型value呢?std::is_same_v<T, U>允许执行比较,仅trueT正好为U- intstd::string在这种情况下才产生:

#include <type_traits>
#include <string>
#include <iostream>

template<typename T>
void my_function(T value) {
    if constexpr (std::is_same_v<T, int>) {
        std::cout << "int\n";
    }
    else if constexpr (std::is_same_v<T, std::string>) {
        std::cout << "string\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

它是这样执行的:

my_function(5); //-> prints out 'int'
my_function(std::string{ "hello" }); //-> prints out 'string'
Run Code Online (Sandbox Code Playgroud)

但是,std::is_same_v不考虑限定词。这是一个问题,例如,这不会输出任何内容:

my_function<const int>(5);
Run Code Online (Sandbox Code Playgroud)

因为const intint。要摆脱它,const任何参考& std::decay_t都将派上用场:

template<typename T>
void my_function(T value) {
    if constexpr (std::is_same_v<std::decay_t<T>, int>) {
        std::cout << "int\n";
    }
    else if constexpr (std::is_same_v<std::decay_t<T>, std::string>) {
        std::cout << "string\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

可以正常工作,如下所示:

my_function<const int>(5);
my_function<const std::string&>(std::string{ "hello" });
Run Code Online (Sandbox Code Playgroud)
int
string
Run Code Online (Sandbox Code Playgroud)