SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
Effective Modern C++
勉強会#1 Item 3, 4
星野 喬 (@starpoz)
サイボウズ・ラボ
2015-01-28
1
Item 3
Understand decltype.
2
decltypeの基本的なルール
• decltypeは通常、名前や式で与えたものの型
を返す
3
const int i = 0; // decltype(i) is const int.
bool f(const Widget& w); // decltype(w) is const Widget&,
// decltype(f) is
// bool(const Widget&)
struct Point {int x, y;}; // decltype(Point::x) is int.
Widget w; // decltype(w) is Widget.
f(w); // decltype(f(w)) is bool.
コンテナのoperator[]が返す型
• コンテナのoperator[]は通常T&を返すが、
std::vector<bool>はbool&を返さない
4
template <typename T>
struct my_vector {
T& operator[](size_t i);
};
my_vector<int>v; // decltype(v) is my_vector<int>.
v[0]; // decltype(v[0]) is int&.
std::vector<bool> w; // decltype(w) is std::vector<bool>.
w[0]; // decltype(w[0]) is
// std::_Bit_reference&.
// (using clang++)
operator[]の返す型を返す関数
• C++11:単文ラムダのみ返り値の型を推論
• C++14:任意のラムダ、関数で推論
5
// C++11
template <typename Container, typename Index>
auto authAndAccess(Container& c, Index i) -> decltype(c[i])
{
return c[i];
}
// C++14
template <typename Container, typename Index>
auto authAndAccess(Container& c, Index i) {
return c[i];
} これだと decltype(c[i]) 型にならない
autoとdecltype(auto)
• autoの部分の型を決定するときに参照情報は
無視される
6
//C++14
template <typename Container, typename Index>
auto authAndAccess(Container& c, Index i) {
return c[i];
}
std::deque<int> d;
authAndAccess(d, 5) = 10;
// compile error
// decltype(authAndAccess(d, 5)) is int.
autoとdecltype(auto) –cont.
• decltype(auto)を使えば参照情報は無視さ
れない
7
//C++14
template <typename Container, typename Index>
decltype(auto) authAndAccess(Container& c, Index i) {
return c[i];
}
std::deque<int> d;
authAndAccess(d, 5) = 10;
// decltype(authAndAccess(d, 5)) is int&.
変数宣言でのdecltype(auto)
• autoで無視される参照情報や
const/volatileが
decltype(auto)では無視されない
8
Widget w;
const Widget& cw = w;
auto myWidget1 = cw; // Widget.
decltype(auto) myWidget2 = cw; // const Widget&.
rvalueを渡せない
• constでないlvalue referenceで受ける引
数にrvalueは渡せない
9
template <typename Container, typename Index>
decltype(auto) authAndAccess(Container& c, Index i);
std::deque<std::string> makeStringDeque();
auto s = authAndAccess(makeStringDeque(), 5);
// compile error
Universal referenceを使う
• Perfect forwarding
10
//C++14
template <typename Container, typename Index>
decltype(auto) authAndAccess(Container&& c, Index i) {
return std::forward<Container>(c)[i];
}
//C++11
template <typename Container, typename Index>
auto authAndAccess(Container&& c, Index i) ->
decltype(std::forward<Container>c[i]);
std::deque<std::string> makeStringDeque();
auto s = authAndAccess(makeStringDequeu(), 5);
decltypeの特殊ルール
• decltype(lvalue expression)は必ず
lvalue referenceになる
11
int x = 0;
decltype(x) y1;
// x is name, so y1’s type is int.
decltype((x)) y2;
// (x) is lvalue expression, so y2’s type is int&.
decltypeの特殊ルール –cont.
• 関数の返り値型の推論も同様
12
decltype(auto) f1() {
int x = 0;
return x; // int
}
decltype(auto) f2() {
int x = 0;
return (x); // int&
} ローカル変数の参照を返してしまっている
Item 3 Things to Remember
• decltypeは大体は変数や式の型になる
• 型Tの名前以外のlvalue expressionについての
decltypeは型T&になる.
• C++14はdecltype(auto)をサポートし、
auto同様に初期化子から推論するが、
decltypeのルールに従う
13
Item 4
Know how to view
deduced types.
14
推論された型を知る3つの方法
• IDEを使う
• コンパイラを使う
• 型を表示するコードを書く
• typeid
• Boost TypeIndex
15
IDEを使う
• 変数にマウスカーソルを合わせれば型が分かる
16
const int x;
auto y = x; // int y
auto z = &x; // const int *z
IDEを使う –cont.
• 複雑な型だと分かりづらい
17
template <typename T>
void f(const T& param) {}
struct Widget {};
std::vector<Widget> createVec() { return {{}}; }
int main(){
const auto v = createVec();
f(&v[0]);
// void f<const std::_Simple_types<std::_Wrap_alloc<
// std::_Vec_base_types<Widget, std::allocator<Widget> >
// ::_Alloc>::value_type>::value_type *>(
// const std::_Simple_types<...>::value_type
// *const &param)
} vc2013だとこう表示される
コンパイラを使う
18
template <typename T>
class TD; // TD is Type Displayer.
const int x = 0;
auto y = x;
auto z = &x;
TD<decltype(y)> yType;
TD<decltype(z)> zType;
> clang++ -std=c++1y t.cpp
t.cpp:11:21: error: implicit instantiation of undefined
template 'TD<int>‘
...
t.cpp:12:21: error: implicit instantiation of undefined
template 'TD<const int *>‘
...
コンパイラを使う –cont.
19
std::map<std::string, std::vector<int>> m;
const auto v = m;
TD<decltype(m)> mType;
> clang++ -std=c++1y t.cpp
...
t.cpp:16:21: error: implicit instantiation of undefined
template
'TD<std::map<std::basic_string<char>, std::vector<int,
std::allocator<int> >,
std::less<std::basic_string<char> >,
std::allocator<std::pair<const std::basic_string<char>,
std::vector<int, std::allocator<int> > > > > >'
TD<decltype(m)> mType;
...
typeidを使う
• i: int
• P: pointer
• K: const
20
const int x = 0;
auto y = x;
auto z = &x;
std::cout << typeid(y).name() << std::endl;
std::cout << typeid(z).name() << std::endl;
> clang++ -sd=c++1y t.cpp && ./a.out
i
PKi
typeidを使う –cont.
21
struct Widget {};
std::vector<Widget> createVec() { return {{}}; }
template <typename T>
void f(const T& param){
std::cout << typeid(T).name() << std::endl;
std::cout << typeid(param).name() << std::endl;
}
const auto v = createVec();
f(&v[0]);
> clang++ -sd=c++1y t.cpp && ./a.out
PK6Widget // 正しい
PK6Widget // 誤 const Widget *
// 正 const Widget * const &
Boost TypeIndexを使う
22
#include <iostream>
#include <vector>
#include <boost/type_index.hpp>
template <typename T>
void f(const T& param) {
using boost::typeindex::type_id_with_cvr;
std::cout
<< type_id_with_cvr<T>().pretty_name() << std::endl
<< type_id_with_cvr<decltype(param)>().pretty_name()
<< std::endl;
}
struct Widget {};
std::vector<Widget> createVec() { return {{}}; }
int main() {
const auto v = createVec();
f(&v[0]);
}
Boost TypeIndexを使う –cont.
• TypeIndexはBoost 1.56から使える
23
> clang++ -std=c++1y t.cpp && ./a.out
Widget const*
Widget const* const&
Item 4 Things to Remember
• 推論された型はIDEやコンパイラのエラーメッ
セージ、Boost TypeIndexライブラリにより確
認することが出来る
• それらの一部は分かりづらく正確でもないこと
があるため、C++の型推論ルールを知ってお
くことはやはり重要である
24

Weitere ähnliche Inhalte

Was ist angesagt?

Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
 
Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26
Akihiro Nishimura
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
 

Was ist angesagt? (20)

Effective modern c++ 5
Effective modern c++ 5Effective modern c++ 5
Effective modern c++ 5
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
C言語講習会4
C言語講習会4C言語講習会4
C言語講習会4
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 

Ähnlich wie Effective Modern C++ 勉強会#1 Item3,4

C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
Akira Takahashi
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
 

Ähnlich wie Effective Modern C++ 勉強会#1 Item3,4 (20)

C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
Effective Modern C++ Item 7&8
Effective Modern C++ Item 7&8Effective Modern C++ Item 7&8
Effective Modern C++ Item 7&8
 
What is template
What is templateWhat is template
What is template
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
More C++11
More C++11More C++11
More C++11
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
C++0x concept
C++0x conceptC++0x concept
C++0x concept
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
Boost17 cpplinq
Boost17 cpplinqBoost17 cpplinq
Boost17 cpplinq
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 

Mehr von Takashi Hoshino

10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション
Takashi Hoshino
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
Takashi Hoshino
 
10分で分かるデータストレージ
10分で分かるデータストレージ10分で分かるデータストレージ
10分で分かるデータストレージ
Takashi Hoshino
 
Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介
Takashi Hoshino
 

Mehr von Takashi Hoshino (20)

Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何か
 
Isolation Level について
Isolation Level についてIsolation Level について
Isolation Level について
 
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
 
WalB Driver Internals
WalB Driver InternalsWalB Driver Internals
WalB Driver Internals
 
トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2
 
トランザクションの並行処理制御
トランザクションの並行処理制御トランザクションの並行処理制御
トランザクションの並行処理制御
 
Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38
 
Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25
 
WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法
 
メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介
 
WalBの紹介
WalBの紹介WalBの紹介
WalBの紹介
 
10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
10分で分かるデータストレージ
10分で分かるデータストレージ10分で分かるデータストレージ
10分で分かるデータストレージ
 
Intel TSX 触ってみた 追加実験 (TTAS)
Intel TSX 触ってみた 追加実験 (TTAS)Intel TSX 触ってみた 追加実験 (TTAS)
Intel TSX 触ってみた 追加実験 (TTAS)
 
Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86opti
 
Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介
 
An Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageAn Efficient Backup and Replication of Storage
An Efficient Backup and Replication of Storage
 
ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法
 
Intel TSX について x86opti
Intel TSX について x86optiIntel TSX について x86opti
Intel TSX について x86opti
 

Effective Modern C++ 勉強会#1 Item3,4