考虑以下因素:
template <typename T> struct template_adapter_t {};
template <int N> struct foo_adapter_t {
template <typename T> static foo_t<T, N> adapt(T const&);
};
template <int N> template_adapter_t< foo_adapter_t<N> > foo();
template <typename Range, typename Adapter>
auto operator|(
Range const& range,
template_adapter_t<Adapter>(*)())
-> decltype(Adapter::adapt(range))
{ return Adapter::adapt(range); }
(那么,这里发生了什么……我有一个“虚拟”类,
template_adapter_t
,它仅用作专门化限制器,一个具体的助手类
foo_adapter_t
,一个自由函数
foo
返回
template\u adapter\u t
,并且过载
operator|
它应该接受LHS上的任何内容,以及指向一个函数的指针,该函数不接受任何参数,并返回某种类型的
template\u adapter\u t
在RHS上。)
当我尝试使用此选项时:
int const values[] = { ... };
values | foo<2>;
。。。我得到一个关于无效操作数的错误。
然而,这是可行的:
std::vector<int>{} | foo<2>;
这
而且
工程:
template <typename Range, int N>
auto operator|(
Range const& range,
foo_adapter_t<N> const& adapter)
-> decltype(adapter.adapt(range))
{ return adapter.adapt(range); }
values | foo_adapter_t<4>{};
。。。所以问题似乎不在于LHS上的匹配。在这两种情况下,RHS也是模板化的,但出于某种原因,采用结构的RHS可以工作,而采用函数的RHS则不能工作。
我遗漏了什么,替代调用可以工作,但第一个不能?我怎样才能使第一张表格生效?
Live example