我想将 Boost Parameter 与重载调用运算符 ( operator()
) 一起使用:
#include <string>
#include <boost/parameter/keyword.hpp>
#include <boost/parameter/preprocessor.hpp>
struct add_argument_tag
{
struct name_;
struct descr_;
};
static inline boost::parameter::keyword<add_argument_tag::name_>& name = boost::parameter::keyword<add_argument_tag::name_>::get();
static inline boost::parameter::keyword<add_argument_tag::descr_>& descr = boost::parameter::keyword<add_argument_tag::descr_>::get();
struct config
{
BOOST_PARAMETER_MEMBER_FUNCTION(
(config),
operator(),
add_argument_tag,
(required (name_, (std::string const&)))
(optional
(descr_, (std::string const&), "")
)
)
{
return *this;
}
};
int main()
{
config my_config;
my_config
("foo")
("bar", descr = "some description");
}
不幸的是,它不起作用:
In file included from /usr/include/boost/mpl/aux_/integral_wrapper.hpp:22,
from /usr/include/boost/mpl/int.hpp:20,
from /usr/include/boost/mpl/lambda_fwd.hpp:23,
from /usr/include/boost/mpl/aux_/na_spec.hpp:18,
from /usr/include/boost/mpl/identity.hpp:17,
from /usr/include/boost/parameter/aux_/unwrap_cv_reference.hpp:11,
from /usr/include/boost/parameter/keyword.hpp:9,
from /.../main.cpp:2:
/.../main.cpp:18:18: error: expected unqualified-id before ')' token
operator(),
^
/.../main.cpp:18:18: error: expected unqualified-id before ')' token
operator(),
^
/.../main.cpp:18:18: error: expected unqualified-id before ')' token
operator(),
^
/.../main.cpp:16:5: error: expected nested-name-specifier before 'boost_param_result_24operator'
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /.../main.cpp:3:
/.../main.cpp:16:5: error: expected initializer before '<' token
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/boost/mpl/aux_/integral_wrapper.hpp:22,
from /usr/include/boost/mpl/int.hpp:20,
from /usr/include/boost/mpl/lambda_fwd.hpp:23,
from /usr/include/boost/mpl/aux_/na_spec.hpp:18,
from /usr/include/boost/mpl/identity.hpp:17,
from /usr/include/boost/parameter/aux_/unwrap_cv_reference.hpp:11,
from /usr/include/boost/parameter/keyword.hpp:9,
from /.../main.cpp:2:
/.../main.cpp:16:5: error: expected nested-name-specifier before 'boost_param_result_24operator'
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /.../main.cpp:3:
/.../main.cpp:16:5: error: expected initializer before '<' token
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/.../main.cpp:16:5: error: 'boost_param_default_24operator' declared as function returning a function
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/.../main.cpp:16:5: error: 'boost_param_default_24operator' declared as function returning a function
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/boost/mpl/aux_/integral_wrapper.hpp:22,
from /usr/include/boost/mpl/int.hpp:20,
from /usr/include/boost/mpl/lambda_fwd.hpp:23,
from /usr/include/boost/mpl/aux_/na_spec.hpp:18,
from /usr/include/boost/mpl/identity.hpp:17,
from /usr/include/boost/parameter/aux_/unwrap_cv_reference.hpp:11,
from /usr/include/boost/parameter/keyword.hpp:9,
from /.../main.cpp:2:
/.../main.cpp:16:5: error: expected nested-name-specifier before 'boost_param_result_24operator'
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /.../main.cpp:3:
/.../main.cpp:16:5: error: expected initializer before '<' token
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/.../main.cpp:16:5: error: 'boost_param_default_24operator' declared as function returning a function
BOOST_PARAMETER_MEMBER_FUNCTION(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/.../main.cpp: In function 'int main()':
/.../main.cpp:34:15: error: no match for call to '(config) (const char [4])'
("foo")
^
make[3]: *** [CMakeFiles/BoostParameterProblem.dir/build.make:63: CMakeFiles/BoostParameterProblem.dir/main.cpp.o] Error 1
make[2]: *** [CMakeFiles/Makefile2:73: CMakeFiles/BoostParameterProblem.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/BoostParameterProblem.dir/rule] Error 2
make: *** [Makefile:118: BoostParameterProblem] Error 2
我可以通过使用正确命名的函数而不是 来轻松解决这个问题operator()
,但我真的很想在operator()
这里使用...... :)
我猜原因是 Boost Parameter 如何使用宏和元编程来构造辅助函数等,而使用运算符重载函数根本不可能。
有没有人做过这样的工作?甚至可能吗?