c++ - 有没有办法强制用户显式指定模板参数类型?

标签 c++ templates

简短版本:我有一个模板函数,它是“通用的”,但我想强制用户明确指定参数的类型,它们作为参数传递给这个函数。

有什么想法吗?


长版:听起来像是一个糟糕的设计,但这是我的情况,目前我想不出更好的东西。

我试图在一个小的 socket 类中“实现”::setsockopt(我不想有大量的函数,采用不同的参数和做同样的事情)。例如:

template< typename OPTION_VALUE_TYPE >
bool set_option( int level, int option_name, const OPTION_VALUE_TYPE& value )
{
    return -1 != ::setsockopt( fd_, level, option_name, &value, sizeof( value ) );
}

但是,这可能会导致以下情况 - 使用 1 调用 set_option,尝试设置 unsigned char 选项将导致失败,因为 1int。正确的用法是:

set_option< unsigned char >( level, option, 1 );

作为

set_option( level, option, 1 );

可以完美编译,但会出错。

最佳答案

是的,您只需要以一种无法从参数中推导出来的方式使用模板参数。一种常见的做法是在模板类中使用 typedef:

template <typename T>
struct identity {
  typedef T type;
};

template <typename OPTION_VALUE_TYPE>
bool set_option(int level, int option_name,
                typename identity<const OPTION_VALUE_TYPE&>::type value);

要使用标准库中已经存在的类型,您可以使用 enable_if :

template <typename OPTION_VALUE_TYPE>
bool set_option(int level, int option_name,
                typename std::enable_if<true, const OPTION_VALUE_TYPE&>::type value);

不允许类型参数推导的原因是因为编译器不能排除 identity 的特化。 : 编译器不能排除你在做

template <>
struct identity<U> { typedef V type; };

哪里identity<U>::type将不再是 U .

关于c++ - 有没有办法强制用户显式指定模板参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28171518/

相关文章:

c++ - 为什么类型关键字以 "_t"后缀结尾?

c++ - 多态性和方法重载在 C++ 中几乎是一回事吗

c++ - 我可以读取 vector<string>::iterator 的数字位置吗?

c++元素在存储在 map 中时丢失

c++ - 什么是复制省略和返回值优化?

c++ - 给定模板类的模板类的专门化

c++ - 如何使用 doxygen 记录 C++ 模板和模板元函数?

c++ - 将成员函数作为参数传递给函数模板

c++ - 结构中的模板结构问题 -

WPF - 使用 GridView 选择 ListViewItem 的未聚焦颜色