我很困惑为什么下面的代码会被编译器拒绝。请帮忙?
template<template<template<class> class> class Ptr,
template<class> class Container, class T>
inline void print(Ptr<Container<T>> l) {
std::cout << '[';
for (auto it = l->begin(); it != l->end() - 1; ++it) {
std::cout << *it << ", ";
}
std::cout << l->back() << ']' << std::endl;
}
最佳答案
我对@RSahu 的回答中哪些有效,哪些无效以及它是否能解决一般问题感到困惑。
但是,受其启发,我得到了以下解决方案。这只是利用了类模板类可以是可变的这一事实。例如现在与 std::vector<T, A>
兼容或其他具有或多或少模板参数的类(希望是容器)。事实上,对 Ptr
做同样的事情很有用。参数,因此它也与 std::unique_ptr
兼容需要比 std::shared_ptr
更多的模板参数.
http://coliru.stacked-crooked.com/a/40d43526ed77eb9d
#include <iostream>
#include <vector>
#include <memory>
template<template<class...> class Ptr, template<class...> class Container, class T>
inline void f(Ptr<Container<T>> p) {
std::cout << "bla" << std::endl;
}
int main() {
f(std::make_shared<std::vector<int>>());
}
注意:话虽如此,我认为有比强制模式更好的方法来约束参数类型。
例如,这可能是一个替代方案:
template<class PtrContainerT, typename = decltype( std::declval<PtrContainerT>()->back())> //probably pretty much constrains the intended use
inline void f(PtrContainerT&& p) {
using T = typename PtrContainerT::element_type::value_type; //in case you need to know T
std::cout << "bla" << std::endl;
}
http://coliru.stacked-crooked.com/a/fbe43aab94364764
甚至更重要(尽管不是 100% 等效):
template<class PtrContainerT, typename T = typename PtrContainerT::element_type::value_type> //probably pretty much constrains the intended use
inline void f(PtrContainerT&& p) {
std::cout << "bla" << std::endl;
}
使用 std::decay<PtrContainerT>::...etc
如有必要。
关于三重嵌套模板参数的 C++ 正确语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768769/