给定以下模板化函数,如何更改它以利用可变参数模板?也就是说,用一个可变参数而不是P1和P2替换std :: bind占位符?目前我每个arity都有这些函数之一,arity为零,没有P参数,直到具有P1到P9参数的arity 9.如果可能的话,我希望将其合并为一个功能.
template<typename R, typename T, typename U, typename P1, typename P2>
void Attach(R (T::*f)(P1, P2), U p)
{
AttachInternal(p, std::bind(f,
p.get(),
std::placeholders::_1,
std::placeholders::_2));
}
Run Code Online (Sandbox Code Playgroud)
dyp*_*dyp 19
您可以(部分)专门std::is_placeholder用于自定义模板的特化.这样,您可以通过常用int_sequence技术引入占位符生成器.
来自[func.bind.isplace]/2
实现应提供有一个定义
BaseCharacteristic的integral_constant<int, J>,如果T是的类型std::placeholders::_J,否则它应有BaseCharacteristic的integral_constant<int, 0>.程序可以专门该模板用于用户定义类型T为具有BaseCharacteristic的integral_constant<int, N>与N > 0以指示T应该作为占位符类型进行处理.
通常的int_sequence:
#include <cstddef>
template<int...> struct int_sequence {};
template<int N, int... Is> struct make_int_sequence
: make_int_sequence<N-1, N-1, Is...> {};
template<int... Is> struct make_int_sequence<0, Is...>
: int_sequence<Is...> {};
Run Code Online (Sandbox Code Playgroud)
自定义占位符模板和专业化is_placeholder:
template<int> // begin with 0 here!
struct placeholder_template
{};
#include <functional>
#include <type_traits>
namespace std
{
template<int N>
struct is_placeholder< placeholder_template<N> >
: integral_constant<int, N+1> // the one is important
{};
}
Run Code Online (Sandbox Code Playgroud)
我不知道在哪里介绍1; 我认为的地方都不是最佳的.
用它来写一些活页夹:
template<class Ret, class... Args, int... Is>
void my_bind(Ret (*p)(Args...), int_sequence<Is...>)
{
auto x = std::bind(p, placeholder_template<Is>{}...);
x( Args(42)... );
}
template<class Ret, class... Args>
void my_bind(Ret (*p)(Args...))
{
my_bind(p, make_int_sequence< sizeof...(Args) >{});
}
Run Code Online (Sandbox Code Playgroud)
活页夹的用法示例:
#include <iostream>
void foo(double, char, int) { std::cout << __PRETTY_FUNCTION__ << "\n"; }
void bar(bool, short) { std::cout << __PRETTY_FUNCTION__ << "\n"; }
int main()
{
my_bind(foo);
my_bind(bar);
}
Run Code Online (Sandbox Code Playgroud)