タプルは、括弧で囲まれたコンマ区切りのリストです。
()
(,)
(thing,)
(2,3)
私が持っている場合
#define ISTUPLE(x) \\...
ISTUPLE(nope)
0に解決して1に解決するようなものが欲しいISTUPLE((yep))
です。
[FWIW、私はたくさん_RTFM_しました.]
タプルは、括弧で囲まれたコンマ区切りのリストです。
()
(,)
(thing,)
(2,3)
私が持っている場合
#define ISTUPLE(x) \\...
ISTUPLE(nope)
0に解決して1に解決するようなものが欲しいISTUPLE((yep))
です。
[FWIW、私はたくさん_RTFM_しました.]
ちょっとした作業で Preprocessing ライブラリで実行できる可能性がありますが、Variadic Macro Data Library (この質問が投稿されてから Boost に追加されました) には既製のソリューションがあります。BOOST_VMD_IS_TUPLE
は、boost/vmd/is_tuple.hpp で定義されており、探していることを実行する必要があります。
#include <iostream>
#include <boost/vmd/is_tuple.hpp>
#if BOOST_VMD_IS_TUPLE() != 0
#error BOOST_VMD_IS_TUPLE() != 0
#endif
#if BOOST_VMD_IS_TUPLE(nope) != 0
#error BOOST_VMD_IS_TUPLE(nope) != 0
#endif
#if BOOST_VMD_IS_TUPLE((yep)) != 1
#error BOOST_VMD_IS_TUPLE((yep)) != 1
#endif
#if BOOST_VMD_IS_TUPLE(()) != 1
#error BOOST_VMD_IS_TUPLE(()) != 1
#endif
#if BOOST_VMD_IS_TUPLE((,)) != 1
#error BOOST_VMD_IS_TUPLE((,)) != 1
#endif
#if BOOST_VMD_IS_TUPLE((thing,)) != 1
#error BOOST_VMD_IS_TUPLE((thing,)) != 1
#endif
#if BOOST_VMD_IS_TUPLE((2,3)) != 1
#error BOOST_VMD_IS_TUPLE((2,3)) != 1
#endif
static_assert(BOOST_VMD_IS_TUPLE() == 0,"BOOST_VMD_IS_TUPLE() != 0");
static_assert(BOOST_VMD_IS_TUPLE(nope) == 0,"BOOST_VMD_IS_TUPLE(nope) != 0");
static_assert(BOOST_VMD_IS_TUPLE((yep)) == 1,"BOOST_VMD_IS_TUPLE((yep)) != 1");
static_assert(BOOST_VMD_IS_TUPLE(()) == 1,"BOOST_VMD_IS_TUPLE(()) != 1");
static_assert(BOOST_VMD_IS_TUPLE((,)) == 1,"BOOST_VMD_IS_TUPLE((,)) != 1");
static_assert(BOOST_VMD_IS_TUPLE((thing,)) == 1,"BOOST_VMD_IS_TUPLE((thing,)) != 1");
static_assert(BOOST_VMD_IS_TUPLE((2,3)) == 1,"BOOST_VMD_IS_TUPLE((2,3)) != 1");
int main(void)
{
using std::cout;
using std::endl;
cout << "BOOST_VMD_IS_TUPLE() == " << BOOST_VMD_IS_TUPLE() << endl;
cout << "BOOST_VMD_IS_TUPLE(nope) == " << BOOST_VMD_IS_TUPLE(nope) << endl;
cout << "BOOST_VMD_IS_TUPLE((yep)) == " << BOOST_VMD_IS_TUPLE((yep)) << endl;
cout << "BOOST_VMD_IS_TUPLE(()) == " << BOOST_VMD_IS_TUPLE(()) << endl;
cout << "BOOST_VMD_IS_TUPLE((,)) == " << BOOST_VMD_IS_TUPLE((,)) << endl;
cout << "BOOST_VMD_IS_TUPLE((thing,)) == " << BOOST_VMD_IS_TUPLE((thing,)) << endl;
cout << "BOOST_VMD_IS_TUPLE((2,3)) == " << BOOST_VMD_IS_TUPLE((2,3)) << endl;
return 0;
}
出力:
BOOST_VMD_IS_TUPLE() == 0
BOOST_VMD_IS_TUPLE(nope) == 0
BOOST_VMD_IS_TUPLE((yep)) == 1
BOOST_VMD_IS_TUPLE(()) == 1
BOOST_VMD_IS_TUPLE((,)) == 1
BOOST_VMD_IS_TUPLE((thing,)) == 1
BOOST_VMD_IS_TUPLE((2,3)) == 1