自动检索返回类型的模板功能
Autodetect return type of template function
我有一些函数的类。在所有类中,函数具有相同的名称和参数类型,但返回类型不同。我需要一些模板函数,可以自动检测无角度括号的正确模板替换。
测试代码以说明问题:
struct Float
{
static Float convert(int i)
{
return Float{static_cast<float>(i)};
}
float _f;
};
struct Int
{
static Int convert(int i)
{
return Int{i};
}
int _i;
};
template<typename T>
T convert(int i)
{
return T::convert(i);
}
int main()
{
Float f1 = convert<Float>(10);
Int i1 = convert<Int>(10);
// Float f2 = convert(10); compilation error
// Int i2 = convert(10); compilation error
return 0;
}
P.S。模板使我发疯,但我想了解它们。
不确定它是否非常适合您的需求,但是您可以通过类和模板转换操作员模拟想要的东西:
class convert {
int arg;
public:
convert(int arg) : arg(arg) {}
template<class T>
operator T() const {
return T::convert(arg);
}
};
由于模板参数扣除适用于模板转换操作员,因此您可以编写以下内容:
Float f1 = convert(10);
Int i1 = convert(10);
就像您想要的一样。
为什么需要转换函数?您可以使用一个参数构造函数来完成相同的工作。
struct Float
{
Float(int i)
{
_f = static_cast<float>(i);
}
float _f;
};
struct Int
{
Int(int i)
{
_i = static_cast<int>(i);
}
int _i;
};
int main()
{
Float f2 = 10;
Int i2 = 10;
return 0;
}
如果您担心隐式对构造函数的调用,则可以使其 eqwicit
struct Float
{
explicit Float(int i)
{
_f = static_cast<float>(i);
}
float _f;
};
int main()
{
Float f2 = Float(10);
return 0;
}
如果具有相同名称和相同类型的输入参数的函数可以产生不同的返回类型,则代码的可读性会受到影响。
相关文章:
- 确定功能主体中的返回类型
- 返回类型不可知模板类成员功能
- 类型推论模板功能返回类型
- C 中此功能的返回类型的含义
- 如何使用Sfinae为容器创建模板功能,并根据操作员推断返回类型
- 自动检索返回类型的模板功能
- 模板功能涵盖具有不同返回类型的旧版C函数
- enable_if具有类成员功能的返回类型
- 功能指针参数的自动返回类型
- 在模板中获取功能返回类型
- 提升侵入性unordered_set静态成员功能返回错误的尺寸类型
- Clang无法在模板类专业化中编译模板功能,该模板类专业化与模板声明具有 *不同的返回类型 *
- 用于抽象基类和派生类的工厂功能的C 返回类型
- 具有自动和友元功能的返回类型匹配
- 与基类不同的返回类型的C 覆盖功能
- 使用指针返回类型的功能
- C 宣布当前功能返回类型
- C 功能返回模板类型检查
- 获取模板功能函数返回类型的功能类型
- 为什么在操纵函数名称中包含C 功能模板实例的返回类型