2013-07-21 53 views
-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); 
} 

编译器基本上抱怨k不是a constant expression,问题是我不知道如何修改这个使这个工作,我需要一些数据结构来迭代,所以我需要保持向量,我需要一个模板来简化我的生活,所以我看到的越多,我就越感到被困在无限循环中。

+2

不,这不是模板的用例。这是'if(i == 3)cout <<“OK”;'的用例。 – 2013-07-21 06:29:55

+0

@ H2CO3你是什么意思?你可以模拟一个数字值,这是肯定的,'<3>'超载只是为了检查模板调用的某些东西。我需要模板数值。 – user2485710

+0

@userXXX我知道你可以使用** integer **(不是任何数字)作为模板参数。不是一个变量,只有一个编译时常量。我说的是我没有看到模板的必要性。这可能是一个XY问题。 – 2013-07-21 06:35:31

回答

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。我毫不犹豫的说不能用做模板专业化,但至少手抓,我没有看到如何做到这一点,如果有可能的话。

0

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

+0

这就是我需要解决的问题,我通常不会对已经工作的东西提出问题:D – user2485710

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

你不应该使用模板,如果任何需要去<here>不能在编译时平凡推断。在这种情况下,k不是一个常量表达式,因此您不能将其用作模板参数。

模板不是魔术锤。他们有很多用例,但是绝对不可以使用它们。

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


是的,事实上我的问题是如何把这一载体引入恒编译时设定值,真正的问题是不是真正的模板。

您可能可以使用可变参数模板将其关闭。您可以直接在可变参数模板(foo<2, 4, 5, 2, 3, 55>)中使用积分常数,而不使用向量。

我不太喜欢他们,所以这需要一段时间。

编辑:杰里打败了我。

+0

但我可以轻松地重载模板以修改单个值的行为,但我无法使用其他解决方案你建议的那个。 – user2485710

+0

它只是不可能使用运行时值作为模板参数。模板是编译时功能。因此需要不断的表达。 – iolo

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

虽然老实说,我没有看到它的使用情况。