gpt4 book ai didi

C++模板类型推导问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:50 24 4
gpt4 key购买 nike

动机:我想创建一个实用程序类,这样就不必编写:

if( someVal ==  val1 || someVal == val2 || someVal == val3 )

我可以这样写:

if( is(someVal).in(val1, val2, val3) )

这更接近于数学上的“a 是 (b,c,d) 的一个元素”,并且当变量名称“someVal”很长时也可以节省大量输入。

这是我目前的代码(对于 2 和 3 值):

template<class T>
class is {
private:
T t_;
public:
is(T t) : t_(t) { }

bool in(const T& v1, const T& v2) {
return t_ == v1 || t_ == v2;
}
bool in(const T& v1, const T& v2, const T& v3) {
return t_ == v1 || t_ == v2 || t_ == v3;
}
};

但是,如果我这样写,它会编译失败:

is(1).in(3,4,5);

相反,我必须写

is<int>(1).in(3,4,5);

这还不错,但如果编译器能够以某种方式确定类型为 int 而无需我显式指定它会更好。
有没有办法做到这一点,或者我坚持明确指定它?

最佳答案

如果你想保留这个语法,你可以使用像这样的辅助函数:

template<class T>
class is_op {
private:
T t_;
public:
is_op(T t) : t_(t) { }

bool in(const T& v1, const T& v2) {
return t_ == v1 || t_ == v2;
}
bool in(const T& v1, const T& v2, const T& v3) {
return t_ == v1 || t_ == v2 || t_ == v3;
}
};


template< class U >
inline is_op<U> is( U const& v )
{
return is_op<U>( v );
}

int main(int argc, char* argv[])
{
is( 1 ).in( 1 , 2 , 4 );
}

关于C++模板类型推导问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2583749/

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