1つのテンプレート関数の異なるインスタンスを指し示す2つの関数ポインタが等しくないと仮定するのは安全でしょうか? テンプレート化された関数がテンプレートパラメータをまったく使用しない場合でも、まったく同じことが起こります。テンプレート化された関数の異なるインスタンスへのポインタは、等しくないと保証されますか?
は、例えば以下は、私のコンパイラで正常に動作しますが、私は、他にそれがないかどうかわからないんだけど:
class TypeChecker
{
public:
template< typename T > static void foo(void)
{}
template< typename T > static void setType(void)
{ s_fooPtr = &foo<T>; }
template< typename T > static bool checkType(void)
{ return (s_fooPtr == &foo<T>); }
private:
static void (* s_fooPtr)(void);
};
void (* TypeChecker::s_fooPtr)(void) = 0;
int main(void)
{
TypeChecker::setType<char>();
TypeChecker::checkType<char>(); // true
TypeChecker::checkType< unsigned char >(); // false
TypeChecker::checkType< signed char >(); // false
}
3.9.2の「機能」についてはどうですか?その言い回しは、何らかの形で関数がアドレスを持つオブジェクトであることを意味します。 – sharptooth
@fefe: "2つのテンプレートIDは、同じクラスまたは関数を参照しています** **"ただし、 "if only" if。それに気づいた? IMOそれは非常に重要です。そして、IMOは、 "foo()'と 'foo ()'は同じ関数ではないという結論は間違っています。彼らは明らかに標準によって同じ機能である必要はありませんが、あなたの引用は同じ機能ではないことを証明していません**。 –
@sharptooth:3.9.2/2では、ポインタは「オブジェクトポインタ型」と「関数ポインタ型」に分かれています。オブジェクト・ポインタ型は、「** void型へのポインタの型**またはオブジェクト型へのポインタ**はオブジェクト・ポインタ型と呼ばれます」と定義されますが、「**指定可能なポインタの型**関数は関数ポインタ型と呼ばれます。仕様が関数ポインタのための "ポインタ"の使用を避けているようだ。後者では、オブジェクトポインタ型だけが 'メモリ内のバイトのアドレス(1.7)またはヌルポインタ(4.10)のいずれかを表します。 – fefe