如何使用 C++11 中的可变非类型模板参数解决此问题?

How to resolve this issue with variadic non-type template parameter in C++11?

enum Enum
{
    e0,
    e1,
    e2
};

int translate(Enum e)
{
    //...
}

int translate(Enum e, int index)
{
    //...
}

class A
{
public:
    template<typename... Ts>
    A(Ts... ts)
    {
        //...
    }

};

template<Enum... es>
class B
{
public:
    static std::shared_ptr<A> getA()
    {
        //for example,use "int translate(Enum e)"
        //return std::make_shared<A>(translate(es)...);

        //use "int translate(Enum e, int index)"    "index" like the index in "for(int index = 0; index < n; ++index)"
        //how to writer?
    }
};

这是关于可变的非类型模板参数;我想用C++11来解决。

例如:

std::make_shared<A>(translate(e1, 0), translate(e2, 1), translate(e3, 2))

std::make_shared<A>(translate(e1, 0), translate(e2, 1))

std::make_shared<A>(translate(e3, 0), translate(e0, 1))

这是一个使用 std::integer_sequence. It's a C++14 feature, but ports to C++11 do exist 的解决方案(没有使用过,不能保证其质量)。

template<Enum... es>
class B
{
  template <int... Is>
  static std::shared_ptr<A> getAHelper(std::integer_sequence<Is...>) {
    return std::make_shared<A>(translate(es, Is)...);
  }
public:
    static std::shared_ptr<A> getA()
    {
      return getAHelper(std::make_integer_sequence<sizeof...(es)>{});
    }
};