考虑以下示例(我今天发布了几个不同的问题):
#include <iostream>
#include <vector>
#include <array>
#include <type_traits>
// Version A
template<typename T>
constexpr unsigned int f(const T&)
{
return 1;
}
// Version B
template<typename... T1, template<typename...> class T>
constexpr unsigned int f(const T<T1...>&)
{
return 2;
}
// Version C
template<typename T1, template<typename, unsigned int...> class T, unsigned int... N>
constexpr unsigned int f(const T<T1, N...>&)
{
return 3;
}
// Main
int main(int argc, char* argv[])
{
std::integral_constant<int, f(double())> a;
std::integral_constant<int, f(std::vector<double>())> b;
std::integral_constant<int, f(std::array<double, 3>())> c;
std::cout<<a<<b<<c<<std::endl; // The goal is to return 123
return 0;
}
此代码无法编译并返回以下编译错误:
temporary of non-literal type 'std::vector<double>' in a constant expression
如何修改此代码以编译它?
注意:目标是将函数的第一个版本采用的类型转换为 1,将函数的第二个版本采用的类型转换为 2,等等...