std::remove_reference を試しています。たとえば、要素の型を配列から抽出することはできますが、remove_reference を STL コンテナーで動作させるにはどうすればよいでしょうか? たとえば、次の remove_reference を使用して、ベクターの要素にイテレータを返したいとします。
#include <iostream>
#include <vector>
#include <type_traits>
using std::vector;
using std::cout;
using std::endl;
using std::begin;
using std::end;
using std::remove_reference;
template<typename T>
auto my_end(T& c) -> typename remove_reference<decltype(&c[0])>::type
{
return end(c)-1; //compile error when myend<vector> is instantiated
}
int main()
{
int ia[] = {1,2,3,4,5,6,7,8,10};
vector<int> v(begin(ia), end(ia));
auto my_back1 = *my_end(ia);
cout << my_back1 << endl; //prints 10
auto my_back2 = *my_end(v);
cout << my_back2 << endl; //should print 10
}
my_end<vector>
がインスタンス化されたときのコンパイラ エラーは次のとおりです。
cannot convert from 'std::_Vector_iterator<_Myvec>' to 'int *'