C++ 变量参数中的强制转换特定类型

C++ 变量参数中的强制转换特定类型,c++,casting,variadic-templates,variadic-functions,C++,Casting,Variadic Templates,Variadic Functions,我有一个接受可变参数的模板函数 template<typename... Params> void foo(Params... p); 如何进行这种转换?如果您只想转换类型,它只是一个元函数: template<typename T> struct convert { using type = T; }; template<> struct convert<char const*> { using type = Path; }; te

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

template<typename... Params>
void foo(Params... p);

如何进行这种转换?

如果您只想转换类型,它只是一个元函数:

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;

现在在您的参数包扩展中使用它,就像您在原始帖子中所做的那样。

如果您只想转换类型,它只是一个元函数:

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;

现在在您的参数包扩展中使用它,就像您在原始帖子中所做的那样。

不使用traits助手:

template<typename... Params>
void foo(Params... p) {
  bar<std::conditional_t<std::is_same<char const*,Params>{},Path,Params>...>(p...);
}
或者,对于过载:

超载随处可见;它获取一组lambda并返回它们的重载集


.

没有特征助手:

template<typename... Params>
void foo(Params... p) {
  bar<std::conditional_t<std::is_same<char const*,Params>{},Path,Params>...>(p...);
}
或者,对于过载:

超载随处可见;它获取一组lambda并返回它们的重载集


.

你的问题是什么?你的问题是什么?你也可以使用std::conditional\u t,但不确定它是否比你的可读性更强。@raket1111-我自己觉得拼写某些元函数更容易理解。当然,条件句也会产生同样的效果。但我认为这更容易扩展到其他类型;您也可以使用std::conditional\u t,但不确定它是否比您所拥有的可读性更强。@raket1111-我自己觉得拼写某些元函数更容易理解。当然,条件句也会产生同样的效果。但我认为这更容易扩展到其他类型;我正试图使用重载版本解决类似的问题,但我无法让它工作。编译器抱怨无法找到重载对象的可行构造函数。问题可能是不同的重载具有不同的返回类型吗?@NikolausDemmel或您想要的重载版本需要{}?还是扣减指南?或者您的编译器不支持演绎指南?很多东西可能会出错。@NikolausDemmel添加了编译实例链接。感谢提供实例。原来我的酒吧里有东西坏了。现在对我有用了。对于重载,您有重载fs&&…->重载;而我有重载FS…->重载;从别的地方来的。就我而言,这两种方法都有效。我真的不明白什么时候会有所不同。@NikolausDemmel使用“提问”按钮提问是件好事我正试图使用重载版本解决类似的问题,但我无法让它工作。编译器抱怨无法找到重载对象的可行构造函数。问题可能是不同的重载具有不同的返回类型吗?@NikolausDemmel或您想要的重载版本需要{}?还是扣减指南?或者您的编译器不支持演绎指南?很多东西可能会出错。@NikolausDemmel添加了编译实例链接。感谢提供实例。原来我的酒吧里有东西坏了。现在对我有用了。对于重载,您有重载fs&&…->重载;而我有重载FS…->重载;从别的地方来的。就我而言,这两种方法都有效。我真的不明白什么时候会有所不同。@NikolausDemmel使用“提问”按钮提问是件好事