我想定义一个简单的模板函数,它接受运行时值并确定它是否是某些可能值的成员.
用法:
int x; // <- pretend this came from elsewhere...
if (isoneof(x, {5,3,9,25}) ...
Run Code Online (Sandbox Code Playgroud)
就像是:
template <typename T, size_t size>
bool isoneof(T value, T (&arr)[size])
{
for (size_t i = 0; i < size; ++i)
if (value == arr[i])
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
我认为这注定要失败,因为我没有看到如何创建内联静态数组.
我可以用:
int kPossibilities[] = {5,3,9,25};
if (isoneodf(6, kPossibilities)) ...
Run Code Online (Sandbox Code Playgroud)
稍微改变isoneof:
template <typename T1, typename T2, size_t size>
bool isoneof(T1 value, const T2 (&arr)[size])
{
for (size_t i = 0; i < size; ++i)
if (value == arr[i])
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
这也使它更加灵活.
有人提供改进吗?定义"内联静态值集"的更好方法是什么?
Kor*_*icz 12
如果你喜欢这样的话,那么你将是Boost.Assign的一个非常满意的用户.
Boost.Assign实际上证明了这种语义是可能的,但是看一下assign的来源就会说服你自己不想这样做:)
但是你可以创建这样的东西:
if (isoneof(x, list_of(2)(3)(5)(7)(11)) { ...
Run Code Online (Sandbox Code Playgroud)
...缺点是你必须使用它boost::array作为参数而不是内置数组(感谢Manuel) - 然而,这是一个真正开始使用它们的好时机:>
它可以在下一个C++标准中使用.
到目前为止,您可以通过例如重载operator,来启动静态数组的静态对象来解决它.
注意:这个实现是O(n ^ 2)并且可能是优化的 - 它只是为了得到这个想法.
using namespace std;
template< typename T, size_t N >
struct CHead {
T values[N];
template< typename T > CHead<T,N+1> operator,( T t ) {
CHead<T,N+1> newhead;
copy( values, values+N, newhead.values);
newhead.values[N]=t;
return newhead;
}
bool contains( T t ) const {
return find( values, values+N, t ) != values+N;
}
};
struct CHeadProto {
template< typename T >
CHead<T,1> operator,( T t ) {
CHead<T,1> h = {t};
return h;
}
} head;
int main()
{
assert( (head, 1,2,3,4).contains(1) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)