C++ 具有特定类型可变参数的多个函数参数

C++ Multiple function parameters with varargs of a specific type

我是 C++ 的新手,有 Java 背景,所以我不确定我正在寻找的功能是否可以直接实现。

我正在尝试创建一个接受两个不同参数但具有以下要求的 C++ 函数:第一个参数是特定类型的单个输入对象,第二个参数是所有附加对象的变量列表与第一个参数类型相同。

我正在寻找与此 Java 代码类似的东西(如果可能的话)。

public static <E> boolean func(E input, E... args) {}

如果这不可能,有没有人知道某种实现方式可以使它专门用于字符串? 大致如下:

bool func(std::string input, std::string... args) {}

我对这个主题做了一些研究,发现函数模板在这里可能会有所帮助,但我不确定如何使用这种方法支持多种参数类型(相同数据类型)。

我最初的想法是尝试这样的事情:

template<class... T>
bool func(const T input, const T&... args) {}

但这只说明可变参数类型,而不是第一个参数。

任何 help/advice 非常感谢。 提前致谢。

据我所知,没有办法直接引入模板参数包 其中所有类型都必须相同。

不过,您一开始可以很容易地创建一个匹配不同类型的模板,但是如果类型不匹配,SFINAE 就会失败。以下示例通过 return 类型引入 SFINAE(这就是 return 类型 bool 进入 std::enable_if_t 元函数的原因)并且仅提供来自如果所有类型都匹配,则为模板。

template<typename T, typename... Ts>
std::enable_if_t<(std::is_same_v<T, Ts> && ...), bool>
func(const T& input, const Ts&... args) {
    return true;
}

如果您碰巧能够使用 C++20 概念,则可以使用 requires 子句以更具声明性的方式编写此代码,如下所示:

template<typename T, typename... Ts>
requires (std::is_same_v<T, Ts> && ...)
bool func(const T& input, const Ts&... args) {
    return true;
}

您需要定义两种模板类型,一种用于input,一种用于参数包。

函数将如下所示:

template <typename T, typename ... Ts>
bool func(const T & input, const Ts & ... args);

为了保证所有的类型都一样,我们可以合并std::conjunction with std::is_same.

我们还可以利用static_assert,这样如果条件不满足,我们可以在编译时产生一个错误。
它允许我们提供自定义错误消息,以便用户更清楚、更容易理解错误。

它将变成:

template <typename T, typename ... Ts>
bool func(const T & input, const Ts & ... args)
{
    static_assert(std::conjunction_v<std::is_same<T, Ts>...>, "Error: All parameters must be of the same type.");

    //...

    return true;
}

您也可以使用 std::enable_if 而不是 static_assert

我个人更喜欢使用static_assert,因为我们可以使错误更明确。如果我们使用 std::enable_if,万一失败,用户仍然需要检查 his/her 自己的评估条件是什么,以找出错误所在。

在那种情况下,函数将是这样的:

template <typename T, typename ... Ts>
std::enable_if_t<std::conjunction_v<std::is_same<T, Ts>...>, bool>
func(const T & input, const Ts & ... args)
{
    //...

    return true;
}