1

わかりました、これはテンプレートへの私の最初の進出であり、おそらくいくつかの非常にばかげた単純な質問の最初のものになるでしょう.

検討:

template <class T>
void sendit(char *buffer, unsigned len)
{
   // force compile error
}

void sendit<first_valid>(char *buffer, unsigned len)
{
   // this is OK
}


void sendit<second_valid>(char *buffer, unsigned len)
{
   // this is OK
}

基本的には、sendit() プロシージャによって合法的に操作できる「もの」のセットがあり、これらのものに合わせてテンプレートを特殊化するという考えです。ユーザーが sendit()、(技術的には sendit()) を呼び出そうとした場合、私は彼の顔にコンパイル エラーをスローしたいと考えています。

これは実行可能ですか?もしそうなら、どのように?

これは合理的なアプローチですか?

4

1 に答える 1

3

未定義のままにします。

template <class T>
void sendit(char *buffer, unsigned len);

// C++11
template <class T>
void sendit(char *buffer, unsigned len) = delete;

Using= deleteは、推奨される方法 IMO です。

または、ある種の静的アサーションを実行します (C++03 で Boost を使用します)。

template <class T>
void sendit(char *buffer, unsigned len) {
    static_assert(sizeof(T) == 0, "must specialize"); // must use sizeof to make it dependant on T
}

とにかく、ここで型テンプレートが本当に必要ですか? すべきではないと言っているわけではありませんが、次のようなオーバーロードを含む代替手段があることに注意してください。

// This is only if you're using the types as tags
// Don't do this otherwise!!!

void sendit(first_valid, char *buffer, unsigned len)
{
   // this is OK
}


void sendit(second_valid, char *buffer, unsigned len)
{
   // this is OK
}

sendit(first_valid(), ...); // call first
sendit(second_valid(), ...); // call second

または、型の代わりに列挙型をテンプレート パラメーターとして使用します。

enum foo { first, second }

template <foo Foo>
void sendit(char *buffer, unsigned len);

void sendit<first>(char *buffer, unsigned len)
{
   // this is OK
}
于 2012-12-12T23:33:49.950 に答える