在可变参数中转换特定类型

时间:2018-01-06 20:43:14

标签: c++ casting variadic-templates variadic-functions

我有一个接受可变参数的模板函数。

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

如何进行转换?

2 个答案:

答案 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并返回它们的重载集。

Live example