Reputation: 1097
I am trying to write my own implementation of the tuple_size function before looking how it is implemented in C++ library. The problem that I am getting right now is that I am getting wrong answer (1) and I do not see any preconditions for that. Appreciate any help.
#include <iostream>
using namespace std;
namespace tuple_helpers
{
template <typename... Args>
struct _tuple_size;
template<typename T, typename... Args>
class _tuple_size<T, Args...>
{
public:
constexpr static size_t __size()
{
return _tuple_size<Args...>::__size() + 1;
}
};
template<>
class _tuple_size<>
{
public:
constexpr static size_t __size()
{
return 0;
}
};
template<typename T>
class tuple_size
{
public:
enum { value = _tuple_size<T>::__size() };
};
}
int main()
{
using MyTuple = tuple<int, string, bool, double>;
cout << "Size of the tuple is: " << tuple_helpers::tuple_size<MyTuple>::value;
return 0;
}
Upvotes: 1
Views: 217
Reputation: 40826
_tuple_size<ARGS>::__size()
is like sizeof...(ARGS)
. Since you only pass one template parameter, this will always be 1.
You need to actually use the template parameters of the template:
template<typename T>
class tuple_size;
template<typename... Args>
class tuple_size<std::tuple<Args...>> {
public:
enum { value = _tuple_size<Args...>::__size() };
};
// Or to work with any tuple-like classes
template<typename... Args, template<typename...> class Tuple>
class tuple_size<Tuple<Args...>> {
public:
enum { value = _tuple_size<Args...>::__size() };
};
Upvotes: 4