- functional[meta header]
- std[meta namespace]
- function[meta class]
- function template[meta id-type]
- cpp11[meta cpp]
template <class T>
T* target() noexcept;
template <class T>
const T* target() const noexcept;元となる関数を取得する。
target_type() == typeid(T)ならば、保持している関数へのポインタを返す。そうでなければヌルポインタを返す。
- C++14までは、型
Tが「ArgTypes...型をパラメータにとりRを戻り値の型とする関数、または関数オブジェクトであること」が要件とされており、それ以外の型を指定した場合の動作は未定義であった。C++17でこの要件は削除され、Tが呼び出し可能な型であるかどうかによらず、target_type()!= typeid(T)であればヌルポインタを返すことが保証される。
#include <iostream>
#include <functional>
struct ident_functor {
int operator()(int x) const
{ return x; }
};
int ident_func(int x)
{ return x; }
int main()
{
// 関数オブジェクト
{
std::function<int(int)> f = ident_functor();
ident_functor* p = f.target<ident_functor>();
if (p) {
std::cout << (*p)(1) << std::endl;
}
}
// 関数ポインタ
{
std::function<int(int)> f = ident_func;
using fp_type = int(*)(int);
fp_type* p = f.target<fp_type>();
if (p) {
std::cout << (*p)(1) << std::endl;
}
}
}- target[color ff0000]
1
1
- C++11
- Clang: 3.0 [mark verified]
- GCC: 4.3.6 [mark verified]
- Visual C++: ??
- LWG Issue 2591.
std::function's member templatetarget()should not lead to undefined behaviourTが呼び出し可能型であることの事前条件が削除され、target_type() != typeid(T)のときTの呼び出し可能性によらずヌルポインタを返す、広い契約の関数となった- この修正は欠陥報告(DR)であり、C++11以降に遡及して適用される。元は事前条件違反として未定義動作だった領域の明文化であり、処理系は当初からヌルポインタを返していたため