我正在使用C ++进行粒子物理学,我发现自己正在写这样的行:
bool isItCorrect(int i){
if(i==11 || i == 62 || i==-11 || i == 11002 || i==22002) return True
else return false;
}
对我来说,最简单的方法是在C ++中缩短它。在python我能做到:
def isItCorrect( i ):
if (i is in [11,62,-11,11002,22002]) return True
else return False
答案 0 :(得分:5)
您可以在C ++ 11中使用可变参数模板并定义:
template <typename T, typename T1>
bool isItCorrect(T t, T1 t1) {
return t == t1;
}
template <typename T, typename T1, typename... T2>
bool isItCorrect(T t, T1 t1, T2... t2) {
return t == t1 || isItCorrect(t, t2...);
}
并使用:
bool isItCorrect(int i) {
return isItCorrect(i, 62, -11, 110022, 22002);
}
答案 1 :(得分:4)
它可能不是最简单的&#34;,但我通常只使用switch
,例如:
bool isItCorrect(int i)
{
switch (i)
{
case 11:
case 62:
case -11:
case 11002:
case 22002:
return true;
default:
return false;
}
}
答案 2 :(得分:2)
std::set
提供了一个计数函数,其功能与python中的is in
非常相似。
bool isItCorrect(int i) {
return std::set<int>({11, 62, -11, 110022, 22002}).count(i);
}
答案 3 :(得分:1)
您可能可以使用以下内容:您可以将std向量包装到结构中,然后编写一个函数,该值将对该字段进行检查。如果您知道该字段的所有元素是时间的话,这将是有效的。
#include <iostream>
#include <vector>
struct field {
std::vector<int> data { 11, 62, -11, 11002, 22002 };
};
bool isItCorrect( int i, const field& f ) {
for ( auto& d : f.data )
if ( d == i ) return true;
return false;
}
int main() {
field f;
std::cout << std::boolalpha;
std::cout << isItCorrect( 2, f ) << std::endl;
std::cout << isItCorrect( 62, f ) << std::endl;
std::cout << "\nPress any key to quit.";
std::cin.get();
return 0;
}
<强>输出强>
false
true
Press any key to quit.
如果您正在使用任意类型,并且您不知道要检查多少元素,可以使用可变参数函数模板和参数包对其进行模板化:
<强> fieldT.h 强>
#ifndef FIELD_T_H
#define FIELD_T_H
#include <vector>
#include <type_traits>
template<class T>
class fieldT {
private:
std::vector<T> _data;
public:
explicit fieldT( std::vector<T>& data ) : _data( data ) {}
template<class... Args>
fieldT( Args&&... args ) :
_data { std::forward<Args>( args )... } {}
std::vector<T> data() {
return _data;
}
};
template<class T>
bool isItCorrectT( T t, fieldT<T>& f );
template<class T, class... Args>
bool isItCorrectT( T t, Args... args );
#include "fieldT.inl"
#endif // FIELD_T_H
<强> fieldT.inl 强>
template<class T>
bool isItCorrectT( T t, fieldT<T>& f ) {
for ( auto& d : f.data() )
if ( d == t ) return true;
return false;
}
template<class T, class... Args>
bool isItCorrectT( T t, Args... args ) {
fieldT<T> f( args... );
for ( auto& d : f.data() )
if ( d == t ) return true;
return false;
}
在这里,我将类转换为类模板,然后我也模拟了函数isItCorrect
,只创建了2个重载。一个将接受要检查的值和fieldT<T>
对象,其中第二个重载将接受要检查的值以及该类型的任意数量的参数。
以下是使用重载方法使用上述类模板的演示 对于类的每个构造函数:
#include <iostream>
#include <vector>
#include "fieldT.h"
int main() {
std::cout << std::boolalpha;
// First create a vector of floats and instantiate a field<float> passing in that vector.
std::vector<float> floats { 1.0f, 1.1f, 1.2f, 1.3f, 1.4f };
fieldT<float> ff( floats );
// checking for both true and false case using the fieldT<T> above
std::cout << isItCorrectT( 2.0f, ff ) << std::endl;
std::cout << isItCorrectT( 1.2f, ff ) << std::endl;
// Or we can pass the values directly into the function as the
// overloaded version will take all but the first parameter
// and create a field<T> object populating its internal vector.
std::cout << isItCorrectT( 1.5f, 2.9f, 7.5f, 3.4f ) << std::endl;
std::cout << isItCorrectT( 1.5f, 2.9f, -3.7f, 1.5f, 8.9f ) << std::endl;
std::cout << "\nPress any key to quit.";
std::cin.get();
return 0;
}
<强>输出强>
false
true
false
true
Press any key to quit.
真正的好处在于它仍然是通用的和可移植的,并且可以用于<T>
的任意数量的任意数量<T>
。
我没有添加任何测试以确保第一个之后的值属于<T>
类型但是其中一个应该能够轻松地assert
。
正如你在主要内部所看到的那样。实际的函数调用非常干净,易于阅读和使用。即使是类和操作它的函数也非常干净和易读,易于理解,最重要的是它们是通用的,可移植的,可重用的。
答案 4 :(得分:1)
bool isItCorrect(int i)
{
set<int> correctNums { 11, 62, -11, 11002, 22002 };
return correctNums.find(i) != correctNums.end();
}
我相信这是最简单的方法。