在C++-17中,这个构造函数是否有模板推导指南?

在C++-17中,这个构造函数是否有模板推导指南?,c++,c++17,C++,C++17,是否有一个模板推导指南,可以使变量c被推导为类型bar,就像变量b一样 包括 包括 样板 结构foo{ 使用container=std::vector; 使用creator=std::函数; }; 样板 结构条 { bartypename foo::创建者{} }; 结构baz:公共foo{ 静态baz::容器make_it{return{};} }; int main{ 酒吧bbaz::制作它; bar cbaz::make_it;//模拟b的演绎指南是什么? } 这里的困难是由于参数和被推导

是否有一个模板推导指南,可以使变量c被推导为类型bar,就像变量b一样

包括 包括 样板 结构foo{ 使用container=std::vector; 使用creator=std::函数; }; 样板 结构条 { bartypename foo::创建者{} }; 结构baz:公共foo{ 静态baz::容器make_it{return{};} }; int main{ 酒吧bbaz::制作它; bar cbaz::make_it;//模拟b的演绎指南是什么? }
这里的困难是由于参数和被推导的类型之间的关系非常脆弱。这也是不必要的,因为对函数参数有不必要的约束

我看不出有什么理由特别需要在这里使用std::函数。您已经在模板中;您可以采用任何可调用类型,只要它可以用零参数调用,并且它返回适当类型的容器。所以就这么做吧

即使该类型将在内部存储std::函数,构造函数也可以自己执行转换,而不是将其推入函数签名中

一旦构造函数看起来像这样:

template<typename T>
struct bar
{
    template<typename Func>
    bar(Func &&f) { }
};
这对任何invocable类型都有效,这些类型可以存储在std::函数中

但是,如果您不愿意使代码更合理地通用,您仍然可以这样做。事实上,上面的扣除指南将很好地工作。。。只要没有只接受一个参数的其他构造函数。那你就有麻烦了

让你困惑的部分是福。所以扔掉它,列出你正在做的事情。构造函数采用std::函数,可以使用零参数调用该函数以返回向量prvalue,其值类型是您要推断的类型。所以只要说:

template<typename T>
bar(std::function<vector<T>()>) -> bar<T>;

这里的困难是由于参数和被推导的类型之间的关系非常脆弱。这也是不必要的,因为对函数参数有不必要的约束

我看不出有什么理由特别需要在这里使用std::函数。您已经在模板中;您可以采用任何可调用类型,只要它可以用零参数调用,并且它返回适当类型的容器。所以就这么做吧

即使该类型将在内部存储std::函数,构造函数也可以自己执行转换,而不是将其推入函数签名中

一旦构造函数看起来像这样:

template<typename T>
struct bar
{
    template<typename Func>
    bar(Func &&f) { }
};
这对任何invocable类型都有效,这些类型可以存储在std::函数中

但是,如果您不愿意使代码更合理地通用,您仍然可以这样做。事实上,上面的扣除指南将很好地工作。。。只要没有只接受一个参数的其他构造函数。那你就有麻烦了

让你困惑的部分是福。所以扔掉它,列出你正在做的事情。构造函数采用std::函数,可以使用零参数调用该函数以返回向量prvalue,其值类型是您要推断的类型。所以只要说:

template<typename T>
bar(std::function<vector<T>()>) -> bar<T>;