C++ 共轭模板不';t短路
我希望能够评估函数是否接受int类型的一个参数,以及它是否返回void。为此,我使用了C++ 共轭模板不';t短路,c++,templates,c++17,short-circuiting,C++,Templates,C++17,Short Circuiting,我希望能够评估函数是否接受int类型的一个参数,以及它是否返回void。为此,我使用了std::conjunction,因为我认为如果函数不能用int类型的一个参数调用,那么它应该短路,并且不会计算第二个格式错误的表达式,但出于某种原因,我得到了一个编译器错误: #include <iostream> #include <type_traits> template<typename Function> struct oneArgVoid { stati
std::conjunction
,因为我认为如果函数不能用int类型的一个参数调用,那么它应该短路,并且不会计算第二个格式错误的表达式,但出于某种原因,我得到了一个编译器错误:
#include <iostream>
#include <type_traits>
template<typename Function>
struct oneArgVoid
{
static constexpr bool value = std::conjunction_v<std::is_invocable<Function, int>, std::is_void<std::invoke_result_t<Function, int>>>;
};
int main()
{
auto l1 = [](auto x) {};
std::cout << oneArgVoid<decltype(l1)>::value << "\n";
auto l2 = [](auto x) {return 1; };
std::cout << oneArgVoid<decltype(l2)>::value << "\n";
auto l3 = [](auto x, auto y) {};
std::cout << oneArgVoid<decltype(l3)>::value << "\n";
return 0;
}
#包括
#包括
模板
结构oneArgVoid
{
静态constexpr bool value=std::conjunction\u v;
};
int main()
{
自动l1=[](自动x){};
std::cout似乎只有在类型的值上短路,类型本身仍然必须格式良好。因此:std::is_void
在这里实际上是非法的。由于修改:
template<typename Function>
struct argVoid
{
static constexpr bool value = std::is_void_v<std::invoke_result_t<Function, int>>;
};
template<typename Function>
struct oneArgVoid
{
static constexpr bool value = std::conjunction_v<std::is_invocable<Function, int>, argVoid<Function>>;
};
模板
结构argVoid
{
静态constexpr bool value=std::is\u void\u v;
};
模板
结构oneArgVoid
{
静态constexpr bool value=std::conjunction\u v;
};
它可以工作,因为格式错误的表达式现在在value变量中,这意味着由于短路,它不会得到计算。@HolyBlackCat似乎没有按预期工作:似乎int可以转换为void?确定是否可以使用参数ArgTypes调用Fn…以生成可转换为R的结果。