Oleg
Oleg

Reputation: 1097

Getting wrong size when calculating tuple size using variadic templates

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

Answers (1)

Artyer
Artyer

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

Related Questions