【问题标题】:Why can't I pass std::vector<MyType> to this function with template template parameters?为什么我不能使用模板模板参数将 std::vector<MyType> 传递给这个函数?
【发布时间】:2020-06-19 08:39:12
【问题描述】:

我是 C++ 模板的新手,我想编写一个模板函数,该函数根据其参数返回单个对象或对象向量。

我有一个包含键/值对的配置类。假设我有键“parent.child.1”,它应该返回一个 id=1 的对象。如果我有键“parent.child”,那么它应该返回子项下的所有对象。 child 下的所有对象都是同一类型,但不同的 child 可能持有不同的对象。

在我看来,生成的代码如下所示:

getParameter<MyObject>(key, value); //value is a referance, if key found copy it into value
getParameter<std::vector<MyObject>>(key, vectorValue); //value is a referance to the vector

我可以通过专门为每种类型的 getParameter 函数乘以 2 来做到这一点,但我认为如果我确实使用模板,我可以为每种不同类型减少大量样板代码。

我已经关注this other SO question,并在我的代码中使用它(我使用的是 c++11,所以它有点不同):

template<typename T>
void getParameter(const string& key, typename enable_if< !is_vector<T>::value,T>::type& val) {...} //Works fine when calling getParameter<MyObject>(key, value);

template<template<typename...>> class C, typename U>
void getParameter(const string& key, typename enable_if< is_vector<C<U>>::value, C<U>>::type& val) {...}//Fails in compile

当我调用getParameter&lt;std::vector&lt;MyObject&gt;&gt;(key, vectorValue); 时,它无法替换这两个函数。这是为什么呢?

【问题讨论】:

    标签: c++ templates config metaprogramming sfinae


    【解决方案1】:

    第二个getParameter 接受两个模板参数,但getParameter&lt;std::vector&lt;MyObject&gt;&gt;(...) 只指定一个模板参数则不会被选中。

    我认为只是让第二个getParameter 采用一个模板参数应该没问题。例如

    template<template T>
    void getParameter(const string& key, typename enable_if< is_vector<T>::value, T>::type& val) {...}
    

    如果要获取元素类型可以使用std::vector的成员类型value_type,比如typename T::value_type。

    【讨论】:

    • 它会,但是我需要访问 std::vector 所持有的类型。
    • @bobku123 std::vector 有一个名为value_type 的成员类型,您可以像typename T::value_type 一样获取它。
    • 我可以在编译时访问 T::value_type 吗?我打算在另一个模板函数里面使用它。
    • @bobku123 是的,当然。您也可以使用它声明变量,如typename T::value_type x;。
    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多