我希望能够为函数的参数接收任何类型,并在函数内部确定给定类型并采取相应措施。
伪代码:
void myFunction(any argument)
{
if(argument is int)
{
myFunctionInt(argument);
}
if(argument is string)
{
myFunctionString(argument);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢。
首先,您应该看一下简单的函数重载,它使您可以在老式的方法中实现它:
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>允许执行比较,仅true在T正好为U- int或std::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 int与int。要摆脱它,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)
Run Code Online (Sandbox Code Playgroud)int string
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |