我发现自己编写了这样的代码:
template <class T>
inline bool allequal(T a,T b,T c) {return a==b&&a==c;}
template <class T>
inline bool allequal(T a,T b,T c,T d) {return a==b&&a==c&&a==d;}
template <class T>
inline bool allequal(T a,T b,T c,T d,T e) {return a==b&&a==c&&a==d&&a==e;}
我想知道是否存在自动执行此操作的方法,而不使用向量或可变参数,因为速度在此上下文中非常重要。
答案 0 :(得分:4)
你可以试试这个:
#include <iostream>
template< typename T >
inline bool allequal( const T& v )
{
return true;
}
template< typename T, typename U, typename... Ts >
inline bool allequal( const T& v, const U& v1, const Ts&... Vs)
{
return (v == v1) && allequal( v1, Vs... );
}
int main()
{
std::cout << std::boolalpha;
std::cout << allequal(1, 1, 1, 1) << std::endl;
std::cout << allequal(1, 1, 2, 2) << std::endl;
return 0;
}
AFAIK有一个关于C ++ 17的提议,包括使用运算符自定义扩展可变参数模板,这些运算符可以避免这种递归,并且这个丑陋(IMO)终止return true
用于一个参数。
注意:许多参数可能无法内联。
答案 1 :(得分:3)
#include <algorithm>
#include <iterator>
template <typename T, typename... Args>
bool allequal(T a, Args... rest)
{
std::initializer_list<T> values = {a, rest...};
return std::adjacent_find(begin(values), end(values), std::not_equal_to<T>()) == end(values);
}
答案 2 :(得分:2)
template<typename First, typename Second>
bool AllOf(First a, Second b)
{
return a == b;
}
template<typename First, typename Second, typename... Rest>
bool AllOf(First a, Second b, Rest... r)
{
return a == b && AllOf(b, r...);
}
std::cout << AllOf(1, 1,1,1) << "\n";
std::cout << AllOf(1, 1,2) << "\n";
std::cout << AllOf(1,2) << "\n";
std::cout << AllOf(1,1) << "\n";