これは私のために働く:
#include <type_traits>
#include <array>
#include <utility>
template <class T2>
inline void f(T2* const myarray)
{
std::pair<double, typename T2::value_type> x;
static_assert(std::is_same<decltype(x.second), int>::value, "");
}
int
main()
{
std::array<int, 2> a;
f(&a);
}
「配列のような」クラス テンプレートに が含まれていない場合はvalue_type
、次の方法も機能するはずです。
std::pair<double, typename std::remove_reference<decltype((*myarray)[0])>::type> x;
ただし、参考までに、const 修飾されたパラメーターは一般的に使用されません。C++ 11 では、たまたまパラメーターを返すと、ペシミゼーションになります (のように)。
return myarray;
この場合myarray
はポインタであり、この場合は const であることは問題ではありません。
代わりに次のことを意味した場合:
inline void f(T2 const* myarray)
( へのポインターでconst T2
はなく、const
へのポインターT2
)
次に、上記のレシピを少し調整する必要があります。
std::pair<double, typename std::remove_const<
typename std::remove_reference<
decltype((*myarray)[0])
>::type
>::type> x;
「配列のような」クラス テンプレートに がvalue_type
ある場合、最初の提案:
std::pair<double, typename T2::value_type> x;
がどこにいても機能しconst
ます。