3

関数を次のように書くことは可能ですか:

void func(uint64_t val) {template <typename T>

void call_with(std::function<void(T)> f, T val) { f(val); }

int main() { auto print = [](int x) { std::cout << x; }; call_with(印刷、42); }}

警告uint64_tを変更せずに、以外の整数型で呼び出された場合、コンパイル時エラーが生成される場所は?#pragma

すなわち:

uint32_t x = 0;
func(x) {…} // Error!
func(uint64_t(x)) {…} // Succes!
4

2 に答える 2

5

関数テンプレートを使用して関数をオーバーロードします。関数テンプレートは、を除くすべての引数タイプによりよく一致しますuint64_t。関数テンプレートを定義して、使用するとエラーが発生するようにすることができます。

void func(uint64_t val) { ... }

template <typename T>
void func(T)
{
    static_assert(false, "argument type is not uint64_t");
}

C ++ 11では、次のテンプレートを使用できます。

template <typename T>
void func(T&&) = delete;
于 2012-10-18T15:41:34.827 に答える
4

これはうまくいきます:

template< typename T >
void func( T param );

template<>
void func<uint64_t>( uint64_t param )
{
}

リンカー エラーが発生します (十分に近い)。サンプル: http://ideone.com/5ft4F

于 2012-10-18T16:02:16.727 に答える