在模板中抛出多个模板类模板参数-模板绑定
Throw multiple-template class in a template template parameter - template binding?
给定以下类:
template <class T, template <typename> class B>
class A { B<T> b; };
我现在可以写这样的代码:
A<float, MyVector> a1;
A<int, MySet> a2;
在B中放置除一个参数外所有参数都指定的多参数类的最优雅方式是什么?就像带有输入键的地图?我唯一能想到的是:
template <class U> using C = MyMap<int, U>;
A<float, C<int>> a3;
是否存在这样一个等价于std::bind的模板,在那里我们只能提供部分形参并保留其中一个打开?我很确定语言没有提供这个,但是人们以前一定解决过这个问题。
A<float, MyMap<int, _>> a3;
没有与std::bind
等价的内置模板,但是您可以自己编写一个。下面是一个简单的版本,它绑定了第一个模板参数,你可以根据自己的需要扩展它:
template <typename T, template <typename...> class B>
struct bind_t1 {
template <typename... Ts>
using type = B<T,Ts...>;
};
然后像这样使用bind_t1
:
A<float, bind_t1<int, std::map>::type> a3;
请注意,对于您的示例,您需要修改模板参数以采用可变的模板:
template <class T, template <typename...> class B>
class A { B<T> b; };
下面是一个稍微扩展的版本,它可以在参数表的开头绑定一些连续的元素:
template <template <typename...> class B, typename... Ts>
struct bind_nt1 {
template <typename... Us>
using type = B<Ts...,Us...>;
};
//Usage
A<std::less<int>, bind_nt1<std::map, int, float>::type> a3;
这是一个基于std::bind
做事方式的通用版本。它不做任何验证,可能有一些边缘情况,但这是一个很好的起点。感谢Piotr Skotnicki的改进。
template <std::size_t N>
struct placeholder{};
template <template <typename...> class B, typename... Ts>
struct bind_t {
private:
template <typename T, typename UTuple>
struct resolve_placeholder {
using type = T;
};
template <std::size_t N, typename UTuple>
struct resolve_placeholder<placeholder<N>, UTuple> {
using type = typename std::tuple_element<N-1, UTuple>::type;
};
public:
template <typename... Us>
using type = B<typename resolve_placeholder<Ts, std::tuple<Us...>>::type...>;
};
//Usage
A<int, bind_t<std::map, float, placeholder<1>, std::less<float>>::type> a3;
使用这个,你甚至可以改变模板参数的顺序:
//std::map<int,float>
bind_t<std::map, placeholder<2>, placeholder<1>>::type<float, int> b;
相关文章:
- 为什么 std::绑定错误参数可以成功?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 绑定到可变参数成员函数
- 如何在 C# 中将带有参数的函数绑定到包中
- 如何将参数绑定到构造函数?
- C++ 如何将参数绑定到具有相同返回类型的函数,并将它们全部存储在一个容器中
- 函数参数绑定通过参考与传递指针传递数组的规则
- C 如何将参数绑定到接受函数的函数
- 模板参数绑定
- 是由BOOST ::返回的函子,仅使用绑定的参数绑定,等效于不采用参数的函数
- 当常量引用参数绑定到右值时,右值是否保持其"status"?
- 用emscripten中的参考参数绑定函数
- 如何将Boost ::函数对象与所有参数绑定
- std ::将参数绑定到没有对象的情况下的成员函数
- 隐马尔可夫模型-在C++中实现参数绑定
- 函数参数绑定的完美转发和歧义
- 为容器中的每个对象调用具有一个参数(绑定)的成员函数
- std::bind():将lambda与右值引用作为参数绑定
- 与派生函数参数绑定
- 与模板模板类一起使用的自定义模板参数绑定器