0

私のコードにはstd::array<T1, N>、関数に匹敵するクラスがあります:

template <class T2>
inline void f(T2* const myarray)
{
    std::pair<double, /*SOMETHING*/> x;
}

T2*に匹敵するクラスへのポインタであると仮定すると、 ?の演算子から取得するstd::array<T1, N>代わりに、何を書く必要があるか知りたいです。/*SOMETHING*/T1[]myarray

注: へのポインターから型を取得するためのより賢い方法を求めているわけではありませんstd::array

4

1 に答える 1

3

これは私のために働く:

#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ます。

于 2013-03-03T03:31:58.300 に答える