有没有一种简单的方法来添加 arg [?] 的当前索引
在我看来,您的使用index
是一种简单的方法。请记住按照 QuentinUK 的建议在 lambda 中捕获它。
无论如何,我建议另一个级别的间接和std::index_sequence
/的使用std::index_sequence_for
如下
template <typename... Args>
void Function (Args... args)
{
[]<std::size_t ... Is>(std::index_sequence<Is...>, auto && ... as)
{
auto process = []<typename Arg>(std::size_t index, Arg && arg)
{
if constexpr ( std::is_same_v<Arg, char *>
|| std::is_same_v<Arg, char const *> )
{
std::size_t sValueSize = strlen(arg) + 1;
// do something with sValueSize
}
};
(process(Is, std::forward<decltype(as)>(as)), ...);
}
(std::index_sequence_for<Args...>{}, std::forward<Args>(args)...);
}
题外话 1:template-lambda 是 C++20 的一个特性。
题外话 2:我强烈建议使用if constexpr
if constexpr ( std::is_same_v<Arg, char *>
|| std::is_same_v<Arg, char const *> )
而不是你的普通(运行时)if
if (typeid(arg) == typeid(char*) || typeid(arg) == typeid(const char*))
因为,对于普通if
的 ,编译器必须编译if
std::size_t sValueSize = strlen(arg) + 1;
当 test 为 false 并且是与 .arg
不兼容的类型时也是如此strlen()
。