自动检索返回类型的模板功能

Autodetect return type of template function

本文关键字:功能 返回类型 自动检索      更新时间:2023-10-16

我有一些函数的类。在所有类中,函数具有相同的名称和参数类型,但返回类型不同。我需要一些模板函数,可以自动检测无角度括号的正确模板替换。

测试代码以说明问题:

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;
}

如果具有相同名称和相同类型的输入参数的函数可以产生不同的返回类型,则代码的可读性会受到影响。