gpt4 book ai didi

c++ - 如何使用 SFINAE 调度到模板化调用运算符(operator)

转载 作者:行者123 更新时间:2023-11-28 01:43:31 24 4
gpt4 key购买 nike

我有一个函数,它接受一个模板化的可调用参数,并将一个索引传递给它。在某些情况下,我希望静态传递该索引(我正在使用元组)。我认为这应该可以通过使用模板化调用运算符传递可调用对象并使用 SFINAE 来实现。

起初,这看起来像:

struct A {
template< size_t I >
void operator()( int x )
{
cout << "A " << x << " " << I << endl;
}
};

struct B {
void operator()( int x, int i )
{
cout << "B " << x << " " << i << endl;
}
};


template<
typename F,
size_t I = 0
>
inline
void
call( int x, F & fn ) {
fn( x, I );
}


int main()
{
A a;
B b;

call( 2, b );
call< B, 3 >( 2, b );

call( 1, a ); // no match for call to '(A) (int&, long unsigned int)'

return 0;
}

所以我尝试重载调用函数并使用 SFINAE 选择正确的调用:

template<
typename F,
size_t I = 0
>
inline
typename std::enable_if< /* I've tried all kinds of things here */ >::type
call( int x, F & fn ) {
fn< I >( x );
}

但我无法找出类型特征来检测 F 是否可以使用一个模板参数和一个 int 参数调用。我一直在引用 this articlethis one但无法使它们适应我的用例。有任何想法吗?不修改call site是否可行?

最佳答案

struct A {
template< std::size_t I >
void operator()( int x, std::integral_constant<std::size_t, I> i ) {
cout << "A " << x << " " << I << endl;
}
};

改用这个。标准 SFINAE 测试有效,没有传递模板非类型参数。

在 C++14 编译器中你可以 std::get<i> .在 C++11 编译器中,您可以 std::get<I>std::get<decltype(i)::value> .

传递模板非类型参数很糟糕。避开它们。

关于c++ - 如何使用 SFINAE 调度到模板化调用运算符(operator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46167081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com