C++中带有鸭子输入的模板
template with duck typing in C++
有没有办法要求模板类型具有属性?
例如:
template <typename T, typename U>
void foo()
{
U a,b;
bool truthiness = T()(a,b);
if (truthiness)
// do something
}
那么,我如何要求T
定义返回特定类型的operator()(U a, U b)
? 这可能吗? (我知道它在 d 中,但我不确定 c++)。
ps. 如果这里的鸭子打字是错误的,请告诉我,我相信它是正确的,但我不确定。
考虑到你的意图,你的语法是错误的。由于T
是一个类型,因此T(1, 2)
将使用双参数构造函数构造类型 T
的临时对象。如果你想打电话给T
的接线员()
T()(1, 2);
假设通过临时工作进行呼叫,以达到您的目的。
如果T
没有这样的运算符()
,代码就无法编译。我实际上会说模板代码的一大好处是,只要语法有效(即您正在谈论的鸭子类型),它就可以"工作",即没有必要通过要求operator ()
存在来进一步限制它。
当然,在我的示例中,这实际上可能是有意义的,因为对于T = void (*)(int, int)
代码在语法上是有效的,但会导致通过空指针调用函数。但同样,这是特定于我的代码版本,我不知道您要将运算符()
应用于哪种类型的T
特定对象。
话虽如此,Boost 库具有相当多的功能,允许人们检查这些属性并将其用于模板元编程和/或静态断言中的分支,这是毫无价值的。
通过简单地表达模板,您需要 T 具有operator()(int, int)
.如果不编译,它将无法编译。
但是,如果您正在创建一个 API 并希望通知 API 的用户他们已经传入了不兼容的类型,那么您需要创建一个检测运算符的类型特征,您可以专门化函数来区分该事实并创建一个static_assert来指示事实。
如果您有权访问 decltype,您可以相对轻松地滚动自己的支票。
template <class T, class U> class check_same_type_t;
template <class T> class check_same_type_t<T, T> { };
template <class T, class U>
void foo()
{
U a,b;
check_same_type_t<bool, decltype(T()(a, b))> check;
bool truthiness = T()(a,b);
if (truthiness) ;
// do something
}
这将实现以下功能:
struct A {
bool operator()(int, int) { return true; }
};
struct B {
int operator()(int, int) { return 1; }
};
int
main()
{
foo<A, int>(); // will compile
foo<B, int>(); // won't compile
}
只要确保这是你真正想要的。强制通用算法使用特定类型可能会回来咬你。如果一个类型隐式转换为布尔值,为什么在你的条件下使用起来不令人满意?
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 读取文件并输入到矢量中
- C++如何通过用户输入删除列表元素
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 用户定义函数中的指针和输入
- 如何在C++中检查2D数组中负值的输入验证
- 如何只允许用户输入正整数
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 输入中的字符串数未知(以字母表示)
- C++中带有鸭子输入的模板
- 为什么 C++1* 仍然需要模板关键字来代替完整的鸭子输入