在位置N检索C ++可变参数模板常量参数的值的适当方法是什么?

时间:2011-01-24 22:34:31

标签: c++ c++11 variadic

我想知道在位置N检索可变参数模板常量参数的值的正确方法是什么(N在编译时是已知的)。例如,假设您有一个模板,它接收一个可变数量的函数指针作为参数,您需要检索第二个函数指针。现在,我能想出的就是这个......

typedef int (*func)(int);

template< func... F >
struct testme
{
 inline int getme(int p) const
 {
  return std::array< func , sizeof... (F) >{F...}[1](p);
 }
};

......不用说,这是非常hackish。有一个更好的方法吗?感谢。

修改

基于typedeftemplate的代码,我创建了一个可以接受任何类型作为可变参数模板参数的版本。它已经过测试,可用于GCC 4.6的实验构建。我发现它可能对其他人有用,所以它就是......

template< std::size_t I, typename T, T... Args >
struct va_lookup;

template< std::size_t I, typename T, T Arg, T... Args >
struct va_lookup< I, T, Arg, Args... >
{
    static_assert(I <= sizeof... (Args), "index is out of bound");
    static constexpr T value = va_lookup< I - 1, T, Args... >::value;
};

template< typename T, T Arg, T... Args >
struct va_lookup< 0, T, Arg, Args... >
{
    static constexpr T value = Arg;
};

2 个答案:

答案 0 :(得分:4)

我认为你可以沿着这些方向使用某些东西:

template <int Index, int... Args> struct LookupAtIndex;
template <int Index, int First, int... Rest> struct LookupAtIndex<Index, First, Rest...> {
    static constexpr int result = LookupAtIndex<Index - 1, Rest...>::result;
};
template <int First, int... Rest> struct LookupAtIndex<0, First, Rest...> {
    static constexpr int result = First;
};

我没有对此进行测试,但至少在直觉上看起来它应该能够正常运行。

答案 1 :(得分:1)

以下是您的解决方案的变体,可能更适合:

typedef int (*func)(int);

template< func... F >
struct testme
{
    static const std::array< func , sizeof... (F) > ptrs_;

    int getme(int p) const
    {
        return ptrs_[1](p);
    }
};

template< func... F >
const std::array< func , sizeof... (F) >
testme<F...>::ptrs_ = {F...};

您的用例的一个基本问题是函数指针不像使用整数类型那样容易进行模板元编程。