gpt4 book ai didi

c++ - 模板化用法不能嵌套在 Visual Studio 中

转载 作者:行者123 更新时间:2023-11-28 04:23:36 37 4
gpt4 key购买 nike

这已经尽可能简化了,但仍然存在错误:

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我想用它来查找返回类型。但是我从 得到这个错误版本 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它甚至可以在 上正常工作如果我不将一个 using 语句传递给另一个:

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。但除非你可以使用 result_of or invoke_result 通过更改 call_t 在 15.6.7 上解决该问题到:

template<typename F, typename T>
using call_t = result_of_t<F&&(T, T, T)>;

请注意 result_of 中已弃用因此,如果您使用“/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> using call_t = result_of_t<F&&(Args&&...)>template<typename F, typename... Args> using 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++ - 模板化用法不能嵌套在 Visual Studio 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949124/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com