ページ 1 / 1
C++の質問です
Posted: 2012年11月20日(火) 19:52
by Suikaba
コード:
template< typename T >
class IHoge
{
public:
virtual void Func( const T arg ) = 0; // 問題の部分
};
class Data
{};
class Piyo
: public IHoge<int>
{
public:
virtual void Func( const int arg ) {}
};
class Foo
: public IHoge<Data>
{
public:
virtual void Func( const Data& data ) {}
}
上記のコードのように、Tの型が組み込み型なら値渡し、Tがユーザー定義型等であれば参照渡しがしたいとき、どう書けばいいのでしょうか。
boost::call_traitsはそもそもtemplate parameterを直に渡すべきでないと教えていただきましたので、知ってい方がいればお願いします。
Visual Studio 2012で開発しています。
Re: C++の質問です
Posted: 2012年11月20日(火) 21:40
by かずま
Suikaba さんが書きました:上記のコードのように、Tの型が組み込み型なら値渡し、Tがユーザー定義型等であれば参照渡しがしたいとき、どう書けばいいのでしょうか。
コード:
template< typename T >
class IHoge
{
public:
virtual void Func( const T arg ) = 0; // 問題の部分
};
class Data
{};
class Piyo
: public IHoge<int>
{
public:
virtual void Func( const int arg ) {}
};
class Foo
: public IHoge<const Data&> // これでいいのでは?
{
public:
virtual void Func( const Data& data ) {}
}; // ; が抜けていました。
int main()
{
Piyo piyo;
Foo foo;
Data data;
piyo.Func(123);
foo.Func(data);
}
Re: C++の質問です
Posted: 2012年11月20日(火) 22:17
by tk-xleader
Suikaba さんが書きました:boost::call_traitsはそもそもtemplate parameterを直に渡すべきでない
この場合はboost::call_traits::param_typeは使えます。ですから、
コード:
template< typename T >
class IHoge
{
public:
virtual void Func(typename boost::call_traits<T>::param_type arg ) = 0; // 問題の部分
};
で大丈夫です。
boost::call_traits::param_typeを使うべきではないのは、テンプレート関数の実引数からテンプレート実引数を推論させる場合です。それは、boost::call_traits::param_typeによって型の推論が妨げられてしまうためです。
Re: C++の質問です
Posted: 2012年11月20日(火) 23:32
by Suikaba
>> かずまさん
確かにそうなんですが、<Data&>とか直感的でなくて自分は少し気持ち悪かったので、どうにかならないかなーと思いました。
ありがとうございます。
>> tk-xleaderさん
あーそういうことでしたか。ありがとうございます。
回答して下さったお二方には感謝いたします。ありがとうございました。