Mapping instance variable type for member function

Imagine what I have

struct A {
 template <class T>
 T getFirstElement();

 vector<float> floatVector;
 vector<int> intVector;
};

in the implementation file:

template <>
float A::getFirstElement<float>() {
  return floatVector[0];
}

template <>
int A::getFirstElement<int>() {
  return intVector[0];
}

Since I know the types of my member variables, even their names seem redundant. Is there a way to have something (like a list of types) that at compile time indicates what are members of this structure? I would like to have something more concise and without explicit specialized specialization.

+4
source share
2 answers

With std::tupleyou can do

struct A {
    template <class T>
    T getFirstElement() const
    {
        return std::get<std::vector<T>>(Vectors)[0];
    }

    std::tuple<std::vector<float>, std::vector<int>> Vectors;
};

And with a variation pattern:

template <typename ... Ts>
struct A_impl {
    template <class T>
    T getFirstElement() const
    {
        return std::get<std::vector<T>>(Vectors)[0];
    }

    std::tuple<std::vector<Ts>...> Vectors;
};

struct A : A_impl<float, int> {};
+4
source

You can write something like:

#include <vector>

template<typename T>
struct VectorProvider
{
  std::vector<T> vector;

  auto& get() {
    return vector;
  }
};

struct A
  : VectorProvider<float>, VectorProvider<int> {

 template <typename T>
 T getFirstElement() {
   return VectorProvider<T>::get()[0];
 }
};

Demo

+1
source

Source: https://habr.com/ru/post/1629698/


All Articles