将实例变量类型映射到模板成员函数

Mapping instance variables type to template member function

本文关键字:成员 函数 映射 实例 变量 类型      更新时间:2023-10-16

>想象一下我有

struct A {
 template <class T>
 T getFirstElement();
 vector<float> floatVector;
 vector<int> intVector;
};

在实现文件中:

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

由于我知道成员变量的类型,因此即使命名它们似乎也有些过分。有没有办法在编译时声明此结构的成员是什么?想要更简洁且没有明确模板专用化的东西。

你可以做std::tuple

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;
};

并使用可变参数模板:

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> {};

你可以这样写:

#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];
 }
};

演示