次の例を検討してください(今日、いくつかの異なる質問に投稿しました):
#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 番目のバージョンで使用される型を 2 などに変換することです...