返回具有不同模板参数值的不同类型(但类型相同)

陈浩南

我想要做的是定义如下3个函数:

template<int t = 0> int test() { return 8; }
template<int t = 1> float test() { return 8.8; }
template<int t = 2> std::string test() { return "8.9"; }

int main()
{
    int a = test<0>();
    float b = test<1>();
    std::string c = test<2>();
    return 0;
}

它们使用相同类型的模板参数,但返回不同类型。

我相信一定有某种方法可以做到这一点(就像这样std::get<>()做),但是我找不到如何做到这一点。

讲故事的人-Unslander Monica

在我看来,您喜欢功能模板的专业化。需要为每个呼叫提供不同的实现方式很合适。然而,有一个警告,那就是专门化可能不会更改被专门化的主模板的签名,而只会改变实现。这意味着我们不能做例如

template<int t> int test(); // Primary
template<> int test<0>() { return 8; } // OK, signature matches
template<> float test<1>() { return 8.8; } // ERROR

但是我们还没有敬酒。专业化的签名必须与主要参数针对特定参数所获得的签名相匹配。因此,如果我们使返回类型取决于template参数,并解析为正确的类型,则可以很好地定义我们的专业化。

template<int t> auto test() -> /* Magic involving t that resolves to int, float, string */;
template<> int test<0>() { return 8; }
template<> float test<1>() { return 8.8; }
template<> std::string test<2>() { return "8.9"; }

是否存在类似的东西?是的,您暗示了这一点。我们可以使用std::tuple它有一个std::tuple_element实用程序,可以将整数映射到类型序列之一(元组的元素)。有了一个小帮手,我们就可以构建我们的代码来按您希望的方式工作:

using types = std::tuple<int, float, std::string>;

template<int t> auto test() -> std::tuple_element_t<t, types>;

template<> int test<0>() { return 8; }
template<> float test<1>() { return 8.8; }
template<> std::string test<2>() { return "8.9"; }

现在,每个专业化名称都匹配主要的签名。因此,我们得到了编译器的认可。

现场观看

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++模板可返回具有相同参数的不同类型

具有不同类型的模板非类型参数

从类到具有不同模板类型的相同类的转换

具有不同模板参数的函数返回类型

具有两个不同类型参数的隐式模板类型推导

Scala:具有相同类的对象具有不同的类型?

是否可以构建具有不同类型的可变参数模板?

如何创建可以处理具有不同类型参数的std :: set的模板类

具有相同类型但名称不同的多个元素?

TypeScript:具有相同形状的对象的不同类型

在C中实现2个具有相同类型和名称但参数不同的函数

多次实现相同的通用接口,该通用接口包含具有不同类型参数的属性

具有不同类型的可变参数的宏

具有不同类型的多个参数的Dapper更新查询

空在具有不同类型的返回功能接口

具有不同类型的copy_if

具有不同类型的Django ArrayField

遍历具有不同类型的列表

具有不同类型节点的图

具有不同类型元素的数组

Java模板,如何使用两个具有相同名称和不同类型的类

对不同类型使用具有不同收益的模板函数不起作用

将具有不同类型且继承相同类的对象存储在容器中

c可以声明两个具有相同名称,返回类型但参数不同的函数

Scala特征相同的方法和参数具有不同的返回类型

具有相同名称但参数和返回类型不同的虚函数

具有相同名称和参数,不同返回类型的C ++成员函数

具有不同数量和参数类型的模板功能

NoSuchMethod:参数比较有所不同。相同类型,不同对象