-2

我需要使用与模板参数相同类型的元素列表,因此我使用的是向量,但我不确定如何使这项工作

#include <iostream>
#include <cstdint>
#include <vector>

template <uint8_t VAL>
void foo()
{
    std::cout << "__" << std::endl;
};

template <>
void foo<3>()
{
    std::cout << "OK" << std::endl;
};

int main()
{
    std::vector<uint8_t> v = { 2, 4, 5, 2, 3, 55 };
    for (auto &k : v) {
        foo<k>();
    }
    return (0);
}

编译器基本上抱怨knot being a constant expression,问题是我不知道如何修改它以使其工作,我需要一些数据结构来迭代,所以我需要保留向量,我需要一个模板来简化我的生活,所以我看到的越多,我就越觉得自己陷入了无限循环。

4

5 回答 5

3

您可以使用可变参数模板来摆脱将列表实际存储在向量中,因此您只需将值直接传递给变量函数模板:

#include <iostream>

void print(int t) {
    static char const *s [] = { "__", "OK" };
    std::cout << s[t == 3];
}

void print() {}

template<typename... Args>
void print(int n, Args ... args) {
    print(n);
    print(args...);
}

int main() {
    print(2, 4, 5, 2, 3, 55);
}

结果:

________OK__

但是,正如您所看到的,这仍然必须3在运行时评估相等性。我犹豫说它不能通过模板专业化来完成,但至少我不知道该怎么做,如果可能的话。

于 2013-07-21T07:56:12.433 回答
1

<here>如果无法在编译时间上轻松推断出需要执行的操作,则不应使用模板。在这种情况下,k不是常量表达式,因此不能将其用作模板参数。

模板不是魔锤。它们有很多用例,但你不能将它们用于所有事情。

在这个特定的代码片段中,foo应该定义为void foo(uint8_t).


是的,事实上我的问题是如何将该向量转换为一组恒定编译时间的值,真正的问题与模板无关。

您也许可以使用可变参数模板来实现这一点。foo<2, 4, 5, 2, 3, 55>您可以直接在可变参数模板 ( )中使用积分常量,而不是使用向量。

我对它们不是很感兴趣,所以这需要一段时间。

编辑:杰瑞打败了我。

于 2013-07-21T07:09:11.087 回答
1

如果您真的想要一种迭代整数值的编译时常量列表的方法:

#include <iostream>
#include <cstdint>

template <uint8_t VAL>
inline void foo()
{
    std::cout << "__" << std::endl;
}

template <>
void foo<3>()
{
    std::cout << "OK" << std::endl;
}

template <uint8_t... Values>
struct FooHelper {
  static void foo_all() {
  }
};

template <uint8_t First, uint8_t... Rest>
struct FooHelper<First, Rest...> {
  static void foo_all() {
    foo<First>();
    FooHelper<Rest...>::foo_all();
  }
};

template <uint8_t... Values>
void foo_all()
{
    FooHelper<Values...>::foo_all();
}

int main()
{
    foo_all<2, 4, 5, 2, 3, 55>();
}

虽然老实说我没有看到它的用例。

于 2013-07-21T16:39:44.127 回答
0

编译器不可能在编译时推断 k 的可能值,所以我看不出这是如何工作的?

于 2013-07-21T06:36:49.270 回答
0

不,这不适用于非常量表达式。只需使其成为一个普通的旧功能:

#include <iostream>
#include <cstdint>
#include <vector>

void foo(uint8_t VAL)
{
    if(VAL == 3)
        std::cout << "OK" << std::endl;
    else
        std::cout << "__" << std::endl;
};

int main()
{
    std::vector<uint8_t> v = { 2, 4, 5, 2, 3, 55 };
    for (auto &k : v) {
        foo(k);
    }
return (0);
}
于 2013-07-21T07:06:58.623 回答