c – 模板化使用不能嵌套在Visual Studio中
作者:互联网
这简直就像我可以制作一个玩具示例仍然可以找到错误:
struct Vector3f64 {
double x;
double y;
double z;
};
struct Vector3f32 {
float x;
float y;
float z;
};
// I use this to select their element type in functions:
template <typename T>
using param_vector = std::conditional_t<std::is_same_v<std::remove_const_t<std::remove_reference_t<T>>, Vector3f64>, double, float>;
// This is the function I want to pull the return type from:
template <typename T>
T VectorVolume(const T x, const T y, const T z) {
return x * x + y * y + z * z;
}
template<typename F, typename T>
using call_t = decltype(std::declval<F>()(std::declval<T>(), std::declval<T>(), std::declval<T>()));
// This function fails to compile:
template <typename T>
call_t<decltype(&VectorVolume<param_vector<T>>), param_vector<T>> func(const T& param) {
return VectorVolume(param.x, param.y, param.z);
}
int main() {
const Vector3f64 foo{ 10.0, 10.0, 10.0 };
std::cout << func(foo) << std::endl;
}
call_t来自Guillaume Racicot’s answer,我想用它来查找返回类型.但我从visual-studio-2017版本15.6.7得到此错误:
error C2064: term does not evaluate to a function taking 3 arguments<br>
note: see reference to alias template instantiation 'call_t<unknown-type,double>' being compiled
note: see reference to function template instantiation 'unknown-type func(const T &)' being compiled
这在g上工作正常:https://coliru.stacked-crooked.com/a/48b18b66c39486ef如果我没有将一个使用语句传递给另一个,它甚至可以在visual-studio-2017上正常工作:
template <typename T>
call_t<decltype(&VectorVolume<param_vector<T>>), double> func(const T& param) {
return VectorVolume(param.x, param.y, param.z);
}
有没有办法可以解决这个问题?
解决方法:
As mentioned by @NathanOliver正确的解决方案是升级到15.9.5,这是固定的.但是,除非你可以通过将call_t更改为:使用result_of
or invoke_result
来解决15.6.7上的问题:
template<typename F, typename T>
using call_t = result_of_t<F&&(T, T, T)>;
请注意,result_of在c++17中已弃用,因此如果您使用“/ std:c 17”或“/ std:c latest”运行,这将无效,您将需要使用更方便:
template<typename F, typename T>
using call_t = invoke_result_t<F, T, T, T>;
值得注意的是,Guillaume Racicot’s answer使用了一个优雅的veradic模板,它也分别用作:template< typename F,typename ... Args>使用call_t = result_of_t< F&&(Args&& ...)>或模板< typename F,typename ... Args>使用call_t = invoke_result_t< F,Args ...> ;;如果您将func的定义更改为:
template <typename T>
call_t<decltype(&VectorVolume<param_vector<T>>), param_vector<T>, param_vector<T>, param_vector<T>> func(const T& param) {
return VectorVolume(param.x, param.y, param.z);
}
标签:c,templates,return-type,using,visual-studio-2017,visual-studio-2017,visual-studi 来源: https://codeday.me/bug/20191003/1849688.html