我有一个接受可变参数的模板函数。
template<typename... Params>
void foo(Params... p);
我想找到const char*
中给定类型(Params
)的所有出现,以用其他类型替换它们,这些值可以转换为(我自己的Path
类构造函数Path(const char*)
)。想法是有类似
template<typename... Params>
void foo(Params... p) {
bar<convertCharPointerToPath<Params>...>(p...);
}
如何进行转换?
答案 0 :(得分:4)
如果你只想转换类型,它只是一个元函数:
template<typename T> struct convert {
using type = T;
};
template<> struct convert<char const*> {
using type = Path;
};
template<typename T>
using convertCharPointerToPath = typename convert<T>::type;
现在在参数包扩展中使用它,就像在原始帖子中一样。
答案 1 :(得分:2)
没有特质助手:
template<typename... Params>
void foo(Params... p) {
bar<std::conditional_t<std::is_same<char const*,Params>{},Path,Params>...>(p...);
}
或,overload<Fs...>
:
auto identity=[](auto&&x)->decltype(x){return decltype(x)(x);};
template<typename... Params>
void foo(Params... p) {
auto convert = overload([](const char* p){return Path(p);},identity);
bar(convert(p)...);
}
overload
随处可见;它需要一组lambdas并返回它们的重载集。