可变模板的模板专用化



我有两个函数,一个接受可变模板,另一个接受std::vector<std::string>。是否可以在没有额外参数的情况下重写可变模板函数?我试了几件事,但都没用。

template <typename ... Args>
std::string Func(std::string, Args && ...);
template <typename ArgType = std::string, typename Alloc>
std::string Func(std::string, const std::vector<ArgType, Alloc> &);
int main()
{
std::vector<std::string> v;
Func("asd", 1, 2.0f);
Func("asd", v);
}

调用带有可变模板包的Always函数。编译器真的不能确定向量的特殊化吗?感谢

编译器真的不能确定向量专用化吗?

可以,但需要转换为const std::vector<ArgType, Alloc>&,因此选择第一个不需要任何转换的。如果删除const部件,它将选择第二个版本。

如果第一个函数的类型是某种vector,那么您可以创建一个类型特征来取消它的资格。

示例:

template<class... Ts>
struct is_first_a_vector {
static std::false_type test(...); // matches anything
// this matches only if the first argument is a `vector` of some sort:
template<template<class,class> class C, class T, class A, class... Rest>
static auto test(C<T,A>&&, Rest&&...) ->
std::enable_if_t<std::is_same_v<C<T,A>, std::vector<T,A>>, std::true_type>;
static constexpr bool value =
decltype(test(std::declval<std::remove_cvref_t<Ts>>()...))::value;
};

或者:

template <class...>
struct is_first_a_vector_impl : std::false_type {};
template <class T, class A, class... Ts>
struct is_first_a_vector_impl<std::vector<T, A>, Ts...> : std::true_type {};
template <class... Ts>
struct is_first_a_vector
: is_first_a_vector_impl<std::remove_cv_t<std::remove_reference_t<Ts>>...> {};

再加上一个同时具有以上两种类型特征的助手:

template<class... Ts>
inline constexpr bool is_first_a_vector_v = is_first_a_vector<Ts...>::value;

以下是用于启用第一个函数的类型特征,仅当std::string之后的第一个参数不是某种类型的vector时:

template <typename... Args>
std::enable_if_t<!is_first_a_vector_v<Args...>, std::string> // <-
Func(std::string, Args&&...);
template <typename ArgType = std::string, typename Alloc>
std::string Func(std::string, const std::vector<ArgType, Alloc> &);

使用版本1的演示和使用版本2 的演示

相关内容

  • 没有找到相关文章

最新更新