函数中的参数化变量类型(c++)
Parameterized variable type in function (c++)
我试着写一些东西沿着下面的行:
void setData<T>(char * environmentVariable, T &data, T defaultValue)
{
bool ret = false;
// Try to get the environmentVariable
ret = handle.getParam(environmentVariable, data);
if(!ret)
{
data = defaultValue
}
}
int main()
{
int valOne;
float valTwo;
// Get a value of type int
setData("some_int_value", valOne, 10); // 10 is the default value
// Get a value of type float
setData("some_float_value", valTwo, 0.05f); // 0.05 is the default value
}
实现此目的的一种方法是使用va_list。有没有一种方法可以让我在课堂上做到这一点?
谢谢
我想你就快到了:
template<typename T>
void setData(char * environmentVariable, T &data, T defaultValue)
{
// ...
}
这应该是你想要的。但是,请注意,最后两个参数使用了相同的T
,因此这个函数调用将无法推断出T
:
setData("some_float_value", valTwo, 0.05);
因为0.05
是double
,而valTwo
是浮点数。在类型推导期间,不会执行类似的转换,因为编译器正在尝试匹配精确的类型。
这个很容易修复:
setData("some_float_value", valTwo, 0.05f);
// ^
f
后缀使得最后一个参数是float
类型的右值,因此T
可以推导为float
。
可能,您可能希望允许第二个和第三个参数具有不同的类型,只要第三个参数可以转换为第二个参数。在这种情况下,可以这样重新定义函数模板:
template<typename T, typename U>
void setData(char * environmentVariable, T &data, U defaultValue)
{
// ...
}
但是,请注意,这将使您可以自由地使用任意两种类型T
和U
实例化setData()
,而您可能希望仅为可转换为T
的U
实例化模板。一些SFINAE技巧结合std::is_convertible<>
类型特征可以完成这项工作:
#include <type_traits>
template<typename T, typename U,
typename std::enable_if<
std::is_convertible<U, T>::value
>::type* = nullptr>
void setData(char * environmentVariable, T &data, U defaultValue)
{
// ...
}
现在你甚至可以使用你原来的调用而不会得到编译器错误:
setData("some_float_value", valTwo, 0.05);
// ^^^^
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型