テンプレート化されたクラスの破棄時に呼び出される関数オブジェクトをアタッチしようとしています。ただし、関数オブジェクトを一時的に渡すことができないようです。私が得る警告は次のとおりです(コメント行の場合xi.data = 5;
):
warning C4930: 'X<T> xi2(writer (__cdecl *)(void))':
prototyped function not called (was a variable definition intended?)
with
[
T=int
]
構築されたオブジェクトを使用しようとすると、次のようなコンパイル エラーが発生します。
error C2228: left of '.data' must have class/struct/union
長いコードで申し訳ありませんが、状況を評価するにはすべてのコンポーネントを表示する必要があると思います。
template<typename T>
struct Base
{
virtual void run( T& ){}
virtual ~Base(){}
};
template<typename T, typename D>
struct Derived : public Base<T>
{
virtual void run( T& t )
{
D d;
d(t);
}
};
template<typename T>
struct X
{
template<typename R>
X(const R& r)
{
std::cout << "X(R)" << std::endl;
ptr = new Derived<T,R>();
}
X():ptr(0)
{
std::cout << "X()" << std::endl;
}
~X()
{
if(ptr)
{
ptr->run(data);
delete ptr;
}
else
{
std::cout << "no ptr" << std::endl;
}
}
Base<T>* ptr;
T data;
};
struct writer
{
template<typename T>
void operator()( const T& i )
{
std::cout << "T : " << i << std::endl;
}
};
int main()
{
{
writer w;
X<int> xi2(w);
//X<int> xi2(writer()); //This does not work!
xi2.data = 15;
}
return 0;
};
私がこれを試している理由は、関数オブジェクト自体のインスタンスをクラス内に保持することなく、関数オブジェクト型をオブジェクトに「何らかの方法で」アタッチできるようにするためです。したがって、 のオブジェクトを作成するとき、 のオブジェクトclass X
をその中に保持する必要はなくclass writer
、 へのポインターのみを保持する必要があります (ここがBase<T>
必要かどうかはわかりません<T>
が、今のところそこにあります)。
問題は、のオブジェクトを作成してから、のように呼び出すのではなくwriter
、のコンストラクターに渡す必要があるように見えることですX
X<int> xi(writer();
ここで完全にばかげて明白なものを見落としている可能性があります。何か提案はありますか?