【发布时间】:2019-11-01 02:52:41
【问题描述】:
Guillaume Racicot 对this question 给出了关于如何专门化模板变量的出色回答。但是我在visual-studio-2017 创建函数指针的模板数组时遇到了麻烦。例如这段代码:
struct vec
{
double x;
double y;
double z;
};
namespace details
{
template <typename T>
constexpr double X(const T& param) { return param.x; }
template <typename T>
constexpr double Y(const T& param) { return param.y; }
template <typename T>
constexpr double Z(const T& param) { return param.z; }
}
template <typename T, typename = void>
constexpr double (*my_temp[])(const vec&) = { &details::X<T>, &details::Y<T> };
template <typename T>
constexpr double (*my_temp<T, enable_if_t<is_floating_point_v<decltype(details::X(T()))>>>[])(const vec&) = { &details::X<T>, &details::Y<T>, &details::Z<T> };
int main() {
vec foo = { 1.0, 2.0, 3.0 };
for(const auto i : my_temp<decltype(foo)>) {
cout << (*i)(foo) << endl;
}
}
1
2
3
但在visual-studio-2017 中只输出:
1
2
我可以做些什么来解决这个问题吗?
【问题讨论】:
-
嗯...此代码似乎是 ICE clang 8,但不是中继。
-
我无法在 Visual Studio 2017 中使用
/std:c++17编译它,您的意思是不是 Visual Studio 2019? -
FWIW,VS2019 无法编译代码,因此您甚至无法升级修复它。
-
使用
std::array,它适用于所有三个编译器:godbolt.org/z/Ro-WHZ -
@JonathanMee 我是说 MSVS 无法处理语法,并不是说它不好。它处理了您之前 Q 中的琐碎案例,但对此很感兴趣。
标签: visual-studio-2017 visual-studio-2017 c++ templates visual-studio-2017 function-pointers template-variables