是否可以通过通用引用传递模板模板参数值? 例如,考虑处理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)
答案 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
特征写成练习。