对模板模板参数的通用引用

时间:2014-01-09 14:18:36

标签: c++ templates c++11

是否可以通过通用引用传递模板模板参数值? 例如,考虑处理STL序列的函数(非)的这个最小示例:

#include <iostream>
#include <vector>

template < template<typename,typename> class C, template<typename> class A, typename T >
void func(C<T, A<T>>&& c) {
    // usually I'd std::forward here, but let's just use cout...
    std::cout << c.size() << "\n";
}

int main (int argc, char const* argv[]) {
    func(std::vector<float>(2));
    std::vector<float> lv(3);
    func(lv);
}

它不会编译,因为编译器不知道如何在第二次调用func时绑定l值(“lv”)。当涉及C类型的演绎规则时,我有点迷失了。任何人都可以启发我吗?

编辑:虽然我猜这与问题无关:我使用g ++ 4.9和clang 3.5(两个repo HEAD)

1 个答案:

答案 0 :(得分:10)

“通用引用”是一种口语,它总是严格意味着引用T &&,其中T推导的模板参数。

但是,您可以修改代码,使用它:

template <typename T>
void func(T && c) { /* ... std::forward<T>(c) ... */ }

如果您关心T是指定格式,请添加特征:

#include <type_traits>

template <typename T>
typename std::enable_if<IsATemplate<typename std::decay<T>::type>::value>::type
func(T && c) { /* ... std::forward<T>(c) ... */ }

IsATemplate特征写成练习。