为什么我们应该在下面的代码中使用模板包装器?

q0987
template<typename T>
void write_me(T t)
{}

template<>
void write_me<const std::string&>(const std::string&)
{}

// Q2> what is the purpose of this template?
template <typename T> struct convert_type_to_ref 
{
    typedef T value_type;
};

template <> 
struct convert_type_to_ref <std::string>
{
    typedef std::string const & value_type;
};

template <> 
struct convert_type_to_ref <std::string &>
{
    typedef std::string const & value_type;
};

template <typename T> struct HelloStruct {
    void operator()(const T& t) const {
        write_me<typename convert_type_to_ref<T>::value_type>(t);
    }
};        

template <typename T> struct TValue
{
    typedef T value_type;
};

template <typename T>
void functionAAA(const T& one_arg)
{
    HelloStruct<typename TValue<T>::value_type>()(one_arg);
    // HelloStruct<T>()(one_arg); // Q1> Why not simply use T?
}

我见过一些与上面类似的遗留代码。

问题1>以下两种情况有什么区别?选择案例 1 的主要好处是什么?

HelloStruct<typename TValue<T>::value_type>()(one_arg); // case 1

VS

HelloStruct<T>()(one_arg); // Why not simply use T?     // case 2

问题 2> 为什么我们要在这里引入一个间接的,如下所示?

write_me<typename convert_type_to_ref<T>::value_type>(t);

为什么不直接调用如下?

write_me<T>(t);

谢谢

杰洛德42

问题1>以下两种情况有什么区别?选择案例 1 的主要好处是什么?

HelloStruct<typename TValue<T>::value_type>()(one_arg);并且HelloStruct<T>()(one_arg);是相同的。

TValue 可以按原样使用以避免扣除:

template <typename T> void fooA(typename TValue<T>::value_type);
template <typename T> void fooB(T);

thenfooA(42)将无效并需要显式fooA<int>(42).

而这两个fooB(42)fooB<int>(42)有效。

问题 2> 为什么我们要在这里引入一个间接的,如下所示?

convert_type_to_ref<T>似乎是允许传递参数“效率”的试探性(如boost::call_traits

所以

write_me<typename convert_type_to_ref<std::string>::value_type>(t);

write_me<const std::string&>(t);

然而

write_me<typename convert_type_to_ref<int>::value_type>(t);

write_me<int>(t);

但在

template <typename T> struct HelloStruct {
    void operator()(const T& t) const {
        write_me<typename convert_type_to_ref<T>::value_type>(t);
    }
};

t 已经通过 const 引用传递了,所以这种微优化似乎更加多余。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不应该在Java中使用受保护的静态

为什么我们不应该在py脚本中使用sys.setdefaultencoding(“ utf-8”)?

为什么我们应该在线程中使用Join?

为什么在下面的QuickSortAlgo方法中使用了修改后的double []变量'arr',而不是我们最初输入的arr []?

为什么我们应该在Angular中的map()上使用subscribe()?

我们什么时候应该在事件监听器中使用匿名函数?

在什么情况下我们应该在类型声明中使用`[] a`?

什么时候以及为什么我们应该在角度使用View Encapsulation

为什么我应该在Laravel中使用事件和侦听器

为什么我应该在Flutter中使用Cards?

什么时候我们应该在.exs文件中使用defmodule

为什么我们应该在退货声明中使用{}

什么时候我们应该在Rust中使用包装与期望

我们什么时候应该在React Native中使用`accessibilityRole`?

为什么我们不应该在同一层使用多个激活功能?

错误提示为:SchoolDetailsView丢失或覆盖SchoolDetailsView.get_queryset,我应该在下面的代码中解决什么?

我们应该在JWT响应中使用什么Content-type?

为什么在下面的代码中使用$ this&如果我不使用则发生什么,并使用$ this我有什么好处?

触发器的用途是什么,谁能举例说明我们应该在哪里使用?

什么时候应该在我们的项目中使用数据层应用程序?

当响应数据是错误消息时,我们应该在REST回复上使用什么响应代码

我们什么时候应该在 Azure 资源组中使用重新部署按钮

我们什么时候应该在 CodeIgniter 中使用核心?

为什么在下面的scala代码中使用了内部函数,没有内部函数我们不能编写它

Android - 为什么我们应该在片段中使用 saveInstanceState 包而不是片段参数?

为什么在下面的例子中使用 ">=" 不起作用 为什么我们必须使用“-1”?

为什么我们应该在 git commit 命令中使用 -m?

为什么我们使用 (html, body) 下面的代码为什么不只是 body?

为什么我们应该在子组件中使用时将 props 写在花括号中