具有相同参数类型的可变参数模板函数
Variadic template function with equal argument types
我想写一个这样的模板函数:
template <typename T>
void f( const T & ...args ) // <-- This doesn't work, unfortunately.
{
std::array<T> arr = { args... };
// and so forth.
}
显然,C++ 不允许这样做,因为 ...args
的左侧需要一个模板参数包才能工作。我想要的是一个所有参数类型都相同的模板函数。有简单的方法吗?
template <typename ... T>
void f(const T & ... args)
{
std::array<typename std::common_type<T...>::type,
sizeof...(T)> arr = {args...};
}
template <typename ... T>
void f(const T & ... args)
{
auto arr = std::experimental::make_array<void>(args...);
}
void 使 return 类型成为输入参数的 common_type
,否则如果您知道,可以明确指定您想要的类型。
我会在已经提出的解决方案的基础上再添加一个解决方案。
您也可以使用 initializer_list
来做到这一点。
它遵循一个工作示例:
#include<initializer_list>
#include<vector>
#include<string>
template<class T>
void fn(std::initializer_list<T> l) {
std::vector<T> v(l);
// so on
}
int main() {
fn<std::string>({ "foo", " bar" });
return 0;
}
#include <tuple>
#include <type_traits>
template <typename T, typename... Ts>
auto f(const T& t, const Ts&... ts)
-> typename std::enable_if<std::is_same<std::tuple<T, Ts...>
, std::tuple<Ts..., T>
>::value>::type
{
}
我想写一个这样的模板函数:
template <typename T>
void f( const T & ...args ) // <-- This doesn't work, unfortunately.
{
std::array<T> arr = { args... };
// and so forth.
}
显然,C++ 不允许这样做,因为 ...args
的左侧需要一个模板参数包才能工作。我想要的是一个所有参数类型都相同的模板函数。有简单的方法吗?
template <typename ... T>
void f(const T & ... args)
{
std::array<typename std::common_type<T...>::type,
sizeof...(T)> arr = {args...};
}
template <typename ... T>
void f(const T & ... args)
{
auto arr = std::experimental::make_array<void>(args...);
}
void 使 return 类型成为输入参数的 common_type
,否则如果您知道,可以明确指定您想要的类型。
我会在已经提出的解决方案的基础上再添加一个解决方案。
您也可以使用 initializer_list
来做到这一点。
它遵循一个工作示例:
#include<initializer_list>
#include<vector>
#include<string>
template<class T>
void fn(std::initializer_list<T> l) {
std::vector<T> v(l);
// so on
}
int main() {
fn<std::string>({ "foo", " bar" });
return 0;
}
#include <tuple>
#include <type_traits>
template <typename T, typename... Ts>
auto f(const T& t, const Ts&... ts)
-> typename std::enable_if<std::is_same<std::tuple<T, Ts...>
, std::tuple<Ts..., T>
>::value>::type
{
}