[英]Variadic template function: argument number for each argument
我正在使用C ++ 11中的可變函數模板,並且已經有了類似以下代碼的基本思想:
void helper()
{
std::cout << "No args" << std::endl;
}
template< typename T >
void helper( T&& arg )
{
size_t n = 0;
std::cout << "arg " << n << " = " << arg << std::endl;
helper();
}
template< typename T, typename... Arguments >
void helper( T&& arg, Arguments&& ... args )
{
size_t n = sizeof...( args );
std::cout << "arg " << n << " = " << arg << std::endl;
helper( args... );
}
但是,我想要的是參數編號(代碼中的變量n)向上計數而不是向下計數。 我該如何優雅地做到這一點? 我可以編寫一個包裝函數來創建“隱藏的”參數計數,但是我覺得應該有一個更整潔的方法嗎?
謝謝!
你的意思是這樣嗎? 我想我知道您在尋找什么,但是如果沒有,我會毫不猶豫地放棄這個答案:
#include <iostream>
#include <utility>
void helper()
{
std::cout << "no args" << std::endl;
}
template<size_t N, typename T>
void helper(T&& arg)
{
std::cout << "arg " << N << " = " << arg << std::endl;
}
template<size_t N, typename T, typename... Args>
void helper(T&& arg, Args&&... args)
{
helper<N>(std::forward<T>(arg));
helper<N+1, Args...>(std::forward<Args>(args)...);
}
template<typename T, typename... Args>
void helper(T&& arg, Args&& ... args)
{
helper<0>(std::forward<T>(arg), std::forward<Args>(args)... );
}
int main()
{
helper();
std::cout << '\n';
helper("single");
std::cout << '\n';
helper("one", 2U);
std::cout << '\n';
helper(1,"two", 3.0, 4L);
std::cout << '\n';
return 0;
}
輸出量
no args
arg 0 = single
arg 0 = one
arg 1 = 2
arg 0 = 1
arg 1 = two
arg 2 = 3
arg 3 = 4
您可以執行以下操作: 實時示例
#if 1 // Not in C++11 // make_index_sequence
#include <cstdint>
template <std::size_t...> struct index_sequence {};
template <std::size_t N, std::size_t... Is>
struct make_index_sequence : make_index_sequence<N - 1, N - 1, Is...> {};
template <std::size_t... Is>
struct make_index_sequence<0u, Is...> : index_sequence<Is...> {};
#endif // make_index_sequence
namespace detail
{
template<std::size_t...Is, typename... Ts>
void helper(index_sequence<Is...>, Ts&&...args)
{
int dummy[] = {0, ((std::cout << "arg " << Is << " = " << args << std::endl), 0)...};
static_cast<void>(dummy);
}
}
void helper()
{
std::cout << "No args" << std::endl;
}
template<typename ... Ts>
void helper(Ts&&... args)
{
detail::helper(make_index_sequence<sizeof...(Ts)>(), std::forward<Ts>(args)...);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.