使用模板化类型重载函数模板



我有一个给定的函数,如下所示:

template <typename T, typename F>
T function(const F& f) const;

此函数具有各种重载,其中一些重载是基于概念的。类似于以下内容:

template <typename T, std::integral F>
T function(const F& f) const;
template <typename T, std::same_as<double> F>
T function(const double& f) const;

现在,我想使用模板化类型添加一个重载,类似于以下内容:

template <typename T, std::same_as<std::vector<V>> F>
T function(const std::vector<V>& f) const;

为此,我需要指定V类型。但我找不到一种语法可以在不破坏代码的情况下指定V

函数的调用方式如下:

T result = function<T, F>(f);

这意味着,模板类型是明确提供的,重载可能不会改变模板参数的数量或顺序,否则编译器会抱怨。

如何解决这个问题?

我目前没有访问编译器来测试它,但这应该足够了:

template <typename T, typename V>
T function(const std::vector<V>& f) const;

您必须编写自己的概念。

采用了从检查类是否是模板专用化?并添加了一个requires子句以仅接受标准分配器。

template <class T, template <class...> class TT>
struct is_specialization : std::false_type {};
template <template <class...> class TT, class... Ts>
struct is_specialization<TT<Ts...>, TT> : std::true_type {};
template <class T, template <class...> class TT>
concept specializes = is_specialization<T, TT>::value;
template <typename T, specializes<std::vector> F>
T function(const F& f) const requires specializes<F::allocator_type, std::allocator>;

除非模板参数可以手动提供,否则过载解决方案应该使用以下过载:

template <typename T, class V>
T function(const std::vector<V>& f) const;

也许使用需要子句

template <typename T, typename F>
requires std::same_as<std::vector<typename F::value_type>, F>
T function(const F& f) const;

相关内容

  • 没有找到相关文章

最新更新