C++の質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Suikaba
記事: 194
登録日時: 9年前

C++の質問です

#1

投稿記事 by Suikaba » 7年前

コード:

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++の質問です

#2

投稿記事 by かずま » 7年前

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);
}

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: C++の質問です

#3

投稿記事 by tk-xleader » 7年前

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によって型の推論が妨げられてしまうためです。

Suikaba
記事: 194
登録日時: 9年前

Re: C++の質問です

#4

投稿記事 by Suikaba » 7年前

>> かずまさん
確かにそうなんですが、<Data&>とか直感的でなくて自分は少し気持ち悪かったので、どうにかならないかなーと思いました。
ありがとうございます。

>> tk-xleaderさん
あーそういうことでしたか。ありがとうございます。

回答して下さったお二方には感謝いたします。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る