インスタンスでは問題なく動作しますstd::bind
が、インターフェース (純粋仮想クラス) への参照では動作しません。
インターフェイスでの遅延評価 (実行時に具体的なインスタンスを参照する) には、この機能が必要です。
コンパイル エラー
In file included from /usr/include/c++/4.7/functional:56:0,
from junk.cpp:1:
/usr/include/c++/4.7/tuple: In instantiation of ‘struct std::_Head_base<0ul, Integer, false>’:
/usr/include/c++/4.7/tuple:215:12: required from ‘struct std::_Tuple_impl<0ul, Integer>’
/usr/include/c++/4.7/tuple:374:11: required from ‘class std::tuple<Integer>’
/usr/include/c++/4.7/functional:1148:29: required from ‘struct std::_Bind<std::_Mem_fn<int (Integer::*)()const>(Integer)>’
junk.cpp:24:42: required from here
/usr/include/c++/4.7/tuple:166:13: error: cannot declare field ‘std::_Head_base<0ul, Integer, false>::_M_head_impl’ to be of abstract type ‘Integer’
junk.cpp:4:8: note: because the following virtual functions are pure within ‘Integer’:
junk.cpp:6:14: note: virtual int Integer::getInt() const
make: *** [junk] Error 1
これを動作させる方法はありstd::bind
ますか?そうでない場合、ブーストに何かありますか?
コード
#include <functional>
#include <iostream>
struct Integer
{
virtual int getInt() const = 0;
};
struct IntImpl : public Integer
{
virtual int getInt() const { return 42; }
};
int
main( int argv, char* argc[] )
{
// works fine
IntImpl x;
auto f = std::bind( &Integer::getInt, x );
std::cerr << f() << std::endl;
// need an interface because I won't know if concrete class will be x
// or something else until run-time, but y will refer to that instance
Integer& y = x;
// next line won't compile
auto g = std::bind( &Integer::getInt, y );
std::cerr << g() << std::endl;
}