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

时间:2016-02-20 13:38:12

标签: c++ templates

想象一下我有

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

因为我知道我的成员变量的类型,甚至命名它们似乎有点过分。有没有办法让一些东西(比如一个类型列表)在编译时说明这个结构的成员是什么?希望有更简洁的内容,没有明确的模板专业化。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

你可以这样写:

#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