【问题标题】:Automatic template deduction when lhs reference is used使用 lhs 引用时自动扣除模板
【发布时间】:2015-09-23 04:53:58
【问题描述】:

我想知道我是否写了这样的东西:

Type &var = database.get<TYPE>(name);

假设database 是一个能够存储不同数据类型的数据块的容器。为了获得对该数据块的引用,将 name 作为 std::string 传递给 get() 以便在不同的地方通过该调用我可以访问某些“全局”变量。我有 get() 作为模板方法,我想保持这种方式。

我想做的是用这样一种优雅的方式缩短调用:

Type &var = database.get(name);

所以模板推演是自动进行的。现在我可以为此创建一个宏,但这不是我想要做的,因为我认为它不适合这种情况。

这个推论虽然行不通,因为我们需要一个模板参数。为什么编译器不能获取为变量设置的内容并将其作为模板参数自动传递?有没有办法做到这一点?在这种情况下,我不想进行任何类型转换。可以省略吗?

【问题讨论】:

  • 模板推导在编译时完成。编译器在编译时是否知道,存储了哪些数据?

标签: c++ templates type-conversion type-deduction


【解决方案1】:

不,你不能这样做——语言的规则根本不允许编译器考虑var 的声明类型来执行推论。 (请注意,函数模板的模板参数可以在通过获取函数模板的地址来初始化函数指针时推断出来。但是,在这种情况下不是这样。)

但是,您可以通过使用auto 轻松避免两次写入类型或引发任何不需要的转换:

auto& var = database.get<Type>(name);

【讨论】:

  • 是的,好的,谢谢你的解释。 auto 确实是一个不错的选择。
【解决方案2】:

抱歉,这是不可能的。您要做的是根据其参数的值来获得模板化函数的返回类型。 这行不通。

只有在模板参数明显的情况下才能执行自动模板推导(如您所说)。例如:

template<_T> void func(_T param) { }

这可以像这样调用

int a; 
func(a); //instead of func<int>(a);

这里编译器确切地知道你想要做什么。

因为所有模板都是在编译时解析的,所以无法根据任何模糊的参数来更改方法的返回类型。

您可以查看boost::any,它可以很好地完成您的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多