C++ 可变模板和std::bind
给定以下模板化函数,如何更改它以利用可变模板?也就是说,用可变参数而不是P1和P2替换std::bind占位符?目前,每一个arity有一个函数,其中arity 0没有P参数,直到arity 9有P1到P9参数。如果可能的话,我希望把它压缩成一个函数C++ 可变模板和std::bind,c++,templates,C++,Templates,给定以下模板化函数,如何更改它以利用可变模板?也就是说,用可变参数而不是P1和P2替换std::bind占位符?目前,每一个arity有一个函数,其中arity 0没有P参数,直到arity 9有P1到P9参数。如果可能的话,我希望把它压缩成一个函数 template<typename R, typename T, typename U, typename P1, typename P2> void Attach(R (T::*f)(P1, P2), U p) { Attac
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));
}
模板
无效附加(R(T::*f)(P1,P2),U-p)
{
附件内部(p,std::bind(f,
p、 get(),
标准::占位符::_1,
std::占位符::2));
}
您可以(部分)专门化自定义模板的专门化std::is\u占位符。这样,您就可以通过通常的int\u序列
技术引入占位符生成器
来自[func.bind.isplace]/2
实施应提供具有积分常数
如果T
是std::占位符::\u J
的类型,否则它应具有基本特性
的积分常数
。程序可以将此模板专门化为用户定义的类型T
,使其具有BaseCharacteristic
的integral\u常量
和N>0
,以指示T
应被视为占位符类型
通常的int\u序列
:
#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...> {};
我不知道在哪里介绍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) >{});
}
模板
无效我的绑定(Ret(*p)(参数…,整数序列)
{
autox=std::bind(p,占位符\模板{};
x(Args(42)…);
}
模板
无效我的绑定(Ret(*p)(参数…)
{
my_bind(p,make_int_sequence{});
}
活页夹的使用示例:
#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);
}
#包括
void foo(double,char,int){std::cout我想提出一个更简单的解决方案,将成员函数绑定到数量可变的占位符:
模板
函数连接(R(T::*f)(Args…,up)
{
return[p,f](Args…Args)->R{return(p->*f)(Args…;};
};
一个简单的用法示例如下所示
类疯狂添加
{
公众:
CrazyAdd(双val)
:m_crazyPart(val)
{}
双加(双a,双b)
{
返回a+b+m_零件;
}
私人:
双m_疯狂部分;
};
void main(){
CrazyAdd myAdd(39);
//创建绑定到myAdd的函数对象
自动f=附加(&CrazyAdd::add,&myAdd);
//使用参数调用函数
std::cout不幸的是,我认为您必须创建一个包含占位符的参数包,使用sizeof…(P)
我想知道为什么这样一个模板placeholder\u模板
不在标准中。可能是因为std::integer\u sequence
只有C++14?@MatthieuM。只有一个实现定义的(标准)占位符。我想占位符模板通常是有用的,因为您可以可靠地创建一定数量的占位符(即使不使用整数序列技术).我完全同意,除了显式命名它们的问题外,还有一个问题,即即使是小的包扩展也比通过连续的专门化或递归尝试来模拟更容易用真实的包扩展来实现。好的,谢谢。从技术角度来看,这很有趣,但我不确定我会去使用它,因为它有点太高级了,这会使我的代码更难为其他人维护。最后,经过几天的搜索,我终于找到了一个有效的解决方案!谢谢!!!
#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);
}