C++ boost程序选项的自定义验证程序';t与GCC合作,与MSVC合作

C++ boost程序选项的自定义验证程序';t与GCC合作,与MSVC合作,c++,boost,boost-program-options,C++,Boost,Boost Program Options,假设我想要整数选项的特殊处理。根据文档,我必须编写自己的验证函数。考虑下面的短程序。 #包括 #包括 #包括 #包括 名称空间po=boost::program\u选项; 名称空间提升{名称空间程序\选项{ 模板 无效验证(boost::any&v,const std::vector&xs,unsigned int*,int) { STD::在最初的预感时,考虑使用 BOOST_STRONG_TYPEDEF(unsigned int, Unsigned); 仅仅在内置类型上定制行为似乎不是一个

假设我想要整数选项的特殊处理。根据文档,我必须编写自己的验证函数。考虑下面的短程序。

#包括
#包括
#包括
#包括
名称空间po=boost::program\u选项;
名称空间提升{名称空间程序\选项{
模板
无效验证(boost::any&v,const std::vector&xs,unsigned int*,int)
{

STD::在最初的预感时,考虑使用

BOOST_STRONG_TYPEDEF(unsigned int, Unsigned);

仅仅在内置类型上定制行为似乎不是一个好主意


解决方案:它与偏序有关

如果将重载移到
boost::program_options
名称空间之外,它将开始工作(因为它不再与基本模板竞争)

#包括
#包括
#包括
#包括
#包括
#包括
BOOST_STRONG_TYPEDEF(未签名、未签名)
模板
无效验证(boost::any&v、,
常量std::vector&xs,
无符号*p,int)
{

std::cout感谢您提供的解决方案。是的,在GCC中似乎偏序被破坏了。@noxmetus我还不确定。Clang也这么做。它可能是一些可以记录得稍微好一点的东西……该解决方案并不是真正有用的,因为通常人们希望先调用check\u,然后在验证器中获取单个字符串d它们是在program_options头文件中定义的。这不是一个解决方法。我正在解决问题并分享我的想法:)“只在内置类型上自定义行为似乎不是一个好主意”首先,它没有什么错。其次,我的帖子引用:“如果您尝试使用自定义类型而不是unsigned int,GCC无论如何都会尝试使用validate from program_选项,并最终导致一系列错误”。
#include <iostream>
#include <vector>
#include <string>

#include <boost/any.hpp>
#include <boost/serialization/strong_typedef.hpp>
#include <boost/program_options.hpp>

BOOST_STRONG_TYPEDEF(unsigned, Unsigned)

template<class charT>
    void validate(boost::any& v, 
            const std::vector< std::basic_string<charT> >& xs, 
            Unsigned* p, int)
    {
        std::cout << "validate is redefined" << std::endl;
        // do something else
    }

namespace po = boost::program_options;

int main()
{
    po::options_description cmdLineOptions;
    po::variables_map vm;

    Unsigned v;
    const char* args[] = {"tst", "-k", "10"};

    cmdLineOptions.add_options()
        ("key,k", po::value<Unsigned>(&v)->required())
      ;

    po::store(po::command_line_parser(sizeof(args) / sizeof(args[0]), args).options(cmdLineOptions).run(), vm);
    po::notify(vm);

    std::cout << v << '\n';

    return 0;
}