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

IE:

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 回答