abr*_*ert 38 c++ variadic-templates c++14
我有以下问题:
template< size_t... N_i >
class A
{
public:
// ...
void foo()
{
bar( /* 0,...,0 <- sizeof...(N_i) many */);
}
};
Run Code Online (Sandbox Code Playgroud)
我想调用一个函数并向它bar
传递sizeof...(N_i)
许多参数,这些参数都是零,例如,bar(0,0,0)
以防万一sizeof...(N_i) == 3
.如何实施?
Col*_*mbo 60
bar(((void)N_i, 0)...);
Run Code Online (Sandbox Code Playgroud)
逗号运算符将丢弃N_i
,只产生右侧操作数的值(0
).演员表是为了防止N_i
被丢弃的警告.
尽管@Columbo毫无疑问是有趣的答案,但我想建议另一种基于constexpr
'd模板变量的可行解决方案:
#include <cstddef>
template<std::size_t, std::size_t V>
constexpr std::size_t repeat_value = V;
template<std::size_t... N_i>
class A {
template<typename... Args>
void bar(Args&&...) { }
public:
void foo() {
// repeat N_i times value 0
bar(repeat_value<N_i, 0>...);
}
};
int main() {
A<0, 1, 2, 3, 4> a;
a.foo();
}
Run Code Online (Sandbox Code Playgroud)
我发现至少更容易阅读,即使它在编译时的性能方面很糟糕.
您可以轻松地将其概括为:
template<std::size_t, typename T, T V>
constexpr T repeat_value = V;
Run Code Online (Sandbox Code Playgroud)
特定情况下的调用如下:
bar(repeat_value<N_i, int, 0>...);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2652 次 |
最近记录: |