使用模板化类型重载函数模板
Overload function template using a templated type
我有这样的给定函数:
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;
你必须写出你自己的概念。
通过检查 class 是否是 的特化并添加了一个要求子句以仅接受标准分配器。
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;
也许使用 requires-clause?
template <typename T, typename F>
requires std::same_as<std::vector<typename F::value_type>, F>
T function(const F& f) const;
我有这样的给定函数:
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;
你必须写出你自己的概念。
通过检查 class 是否是
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;
也许使用 requires-clause?
template <typename T, typename F>
requires std::same_as<std::vector<typename F::value_type>, F>
T function(const F& f) const;