Ric*_*ock 9 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);
}
Run Code Online (Sandbox Code Playgroud)
它不会编译,因为编译器不知道如何在第二次调用func时绑定l值("lv").当涉及C类型的演绎规则时,我有点迷失了.任何人都可以启发我吗?
编辑:虽然我猜这与问题无关:我使用g ++ 4.9和clang 3.5(两个repo HEAD)
Ker*_* SB 10
"通用引用"是一种口语,它总是严格意味着引用T &&
,其中T
是推导出的模板参数.
但是,您可以修改代码,使用它:
template <typename T>
void func(T && c) { /* ... std::forward<T>(c) ... */ }
Run Code Online (Sandbox Code Playgroud)
如果您关心的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) ... */ }
Run Code Online (Sandbox Code Playgroud)
写这个IsATemplate
特质留作练习.
归档时间: |
|
查看次数: |
468 次 |
最近记录: |