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;
}
我是 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;
}