我尝试使用Concept来约束模板参数,使其只允许noexcept
类型的可调用对象。
例如:
template<NoExceptFunc Fn>
void foo(Fn invocable) noexcept {
invocable();
}
字符串
我遇到的困难是,invocable应该是任何类型的invocable(自由函数,lambda,...),并允许任何数量的参数。
编辑:感谢How can unspecified types be used in C++20 'requires' expressions?,我知道这在一般情况下是不可能做到的,你需要知道invocable
实际上是什么,然后才能约束它。
尽管如此,即使我知道invocable
实际上是什么,我也不知道如何表达contrain,见下文。
以下
template <typename T, typename... Args>
concept NoExceptFunc = requires(T &&f, Args &&...args) { requires noexcept(f(args...)); };
型
工作,但需要显式给出参数类型,例如:
template<NoExceptFunc<int, int> Fn>
void foo(Fn invocable) noexcept {
invocable(0, 1);
}
型
问题是,我不知道如何在以下情况下指定参数:
template <NoExceptFunc<??> Fn>
void foo(Fn f) noexcept {
f(1);
f("hello", "world");
}
int main() {
auto lambda = [](auto&& a, auto&&... rest) {
std::cout << a;
if constexpr(sizeof...(rest) != 0) {
std::cout << (rest << ...);
}
std::cout << std::endl;
};
foo(lambda);
}
型
我怎么能说参数可以是OR <const char*,const char*>呢?
1条答案
按热度按时间wmomyfyw1#
如果你可以使用模板化的结构来推导参数,这适用于非泛型/非可变参数的可调用对象:
字符串
使用方法:
型