我希望能够为函数的参数接收任何类型,并在函数内部确定给定类型并采取相应措施。
伪代码:
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 次 |
最近记录: |