4

クラスの静的メンバーのみを操作する静的挿入演算子を定義することは可能ですか?何かのようなもの:

class MyClass
{
public:
    static std::string msg;

    static MyClass& operator<< (const std::string& token) {
        msg.append(token);
        return *this;   // error, static
    }
};

または:

static MyClass& operator<< (MyClass&, const std::string &token)
{
    MyClass::msg.append(token);
    return ?;
}

これが私がそれを使いたい方法です:

MyClass << "message1" << "message2";

ありがとうございました!


ユーザーをサブディレクトリに制限する

各サブフォルダをそのユーザーのみに制限したいユーザーのサブディレクトリがあります。

たとえば、user1だけが内部のファイルにアクセスできるように/users/user1、フォルダーを保護したい場所があります。user1

.htaccessファイルと.htpasswdファイルを試してみましたが、MySQLデータベースに対して認証したのに、もう一度ログインするように求められます。

ユーザーは以前に認証されているため、基本的に2番目のログイン要求を自動的に処理するにはどうすればよいかわかりません。

.htファイル用に持っているコードを投稿することはできますが、この情報でボールが転がる可能性があると思いました。

4

4 に答える 4

10

あなたの状況で私がおそらく行うことは、をオーバーロードする別のクラスを作成しoperator<<、そのタイプの静的メンバーを作成することです。このような:

class MyClass
{
public:
    static std::string msg;

    struct Out {
        Out & operator<< (const std::string& token) {
            MyClass::msg.append(token);
            return *this;
        }
    };

    static Out out;    
};

それを使用することは、あなたが求めたものとはまったく異なりますが、十分に近いと思います:

MyClass::out << "message1" << "message2";
于 2011-11-23T17:44:52.517 に答える
3

のすべてのメンバーMyClassが静的である場合、新しいインスタンスを返すことができます。

ただし、参照を返すと問題が発生します。次の 2 つの解決策があります。

  • 静的インスタンスを定義する
  • 参照ではなくコピーで渡します。

2 番目のアプローチが最も簡単です。

static MyClass operator<< (MyClass, const std::string &token)
{
     MyClass::msg.append(token);
     return MyClass();
}

最初は 1 行追加です。

static MyClass& operator<< (MyClass&, const std::string &token)
{
     static MyClass instance;

     MyClass::msg.append(token);
     return instance;
}

使用法はあなたが望むものに非常に近いです:

MyClass() << "message1" << "message2";

ただし、これを行うことはお勧めしません。だけを使用しないのはなぜstd::ostringstreamですか?書式設定などを無料で利用できます。本当にグローバル アクセスが必要な場合は、グローバル変数を宣言します。

于 2011-11-23T17:46:25.167 に答える
1

クラスをcoutとして使用したい場合、できることは例です

#include <iostream>
using namespace std;
namespace trace
{
  class trace
  {
  public:
    trace& operator<< (const std::string& echo)
    {
      std::cout << echo << std::endl;
      return *this;
    }
  };

  trace t; // Note that we created variable so we could use it.
};

using namespace trace; // Note that we use same namespace so we dont need to do trace::t
int main(int argv, char** argc)
{
  t << "Server started..."
    << "To exit press CTRL + Z";
  return 0;
}

出力は、次のような新しい行の各文字列のようになります。

サーバーが起動しました... 終了するには、CTRL + Z を押してください

于 2012-10-10T21:54:08.683 に答える
0

できません。クラス名/タイプはそれ自体では値ではありません。次のような式が必要です

class Foobar {...};

std::cout << Foobar << std::endl;

staticoperator<<が使用できるようにしますが、それは有効な C++ ではありません。A.4 の文法の要約は、型の名前をそこに置くことは有効ではないことを示しています。

演算子のオーバーロードは、不安定な名前の単なる関数であることも考慮してください。

T  operator<< (T, T)
   ^^^^^^^^^^ flaky name, basically same as:
T  left_shift (T, T)

また、C++ (および C# などの他のほとんどの言語) の関数は、型自体ではなく、型のインスタンスに対してのみ機能します。

ただし、C++ は型引数を持つテンプレートを提供しますが、型に関数をオーバーロードするのには役立ちません。

于 2011-11-23T17:40:26.657 に答える