C++11 Boost可以断言方法调用实例化不会编译吗?

C++11 Boost可以断言方法调用实例化不会编译吗?,c++11,boost,instantiation,assert,template-meta-programming,C++11,Boost,Instantiation,Assert,Template Meta Programming,下面的代码运行良好,我很满意我的健壮类 然而,断言某些方法调用实例化在编译时不通过手动注释in和out进行编译,至少是非常乏味的。我明白,只有通过实际编译才能预见到编译会失败。这是一个棘手的情况。但是,有没有一些漂亮的方法可以避免太多的代码混淆呢 Boost有什么可以提供的吗 #include <tchar.h> #include <type_traits> template<int SOMEMEANINGFULNUMBER> class RobustCla

下面的代码运行良好,我很满意我的健壮类

然而,断言某些方法调用实例化在编译时不通过手动注释in和out进行编译,至少是非常乏味的。我明白,只有通过实际编译才能预见到编译会失败。这是一个棘手的情况。但是,有没有一些漂亮的方法可以避免太多的代码混淆呢

Boost有什么可以提供的吗

#include <tchar.h>
#include <type_traits>

template<int SOMEMEANINGFULNUMBER>
class RobustClass {

private:
    RobustClass() {}

public:
    static RobustClass<SOMEMEANINGFULNUMBER> instance;

    template <int I = SOMEMEANINGFULNUMBER>
    typename std::enable_if<(I != 2) && (I == SOMEMEANINGFULNUMBER)>::type
    doSomething() {
        // Do something smart and useful!
    }
};

template<int SOMEMEANINGFULNUMBER>
RobustClass<SOMEMEANINGFULNUMBER> RobustClass<SOMEMEANINGFULNUMBER>::instance;

typedef RobustClass<0> RobustClass0;
typedef RobustClass<2> RobustClass2;

int _tmain(int argc, _TCHAR* argv[])
{
    RobustClass<0> robustClass0 = RobustClass0::instance;
    RobustClass<2> robustClass2 = RobustClass2::instance;

    robustClass0.doSomething(); // Compiles and runs fine

    // robustClass2.doSomething(); // Beautifully breaks compilation.
                                   // But I want to wrap this call so 
                                   // that it does NOT break the compilation.
                                   // May be a catch22 wish, however.

    return 0;
}
#包括
#包括
模板
类鲁棒类{
私人:
RobustClass(){}
公众:
静态RobustClass实例;
模板
typename std::enable_if::type
doSomething(){
//做些聪明有用的事!
}
};
模板
RobustClass RobustClass::实例;
typedef RobustClass RobustClass0;
类型定义RobustClass RobustClass2;
int _tmain(int argc,_TCHAR*argv[]
{
RobustClass robustClass0=robustClass0::实例;
RobustClass robustClass2=robustClass2::实例;
robustClass0.doSomething();//编译并运行良好
//robustClass2.doSomething();//很好地中断了编译。
//但我想把这个电话结束
//它不会破坏编译。
//然而,这可能是一个诱人的愿望。
返回0;
}

我相信您希望能够检查
RobustClass::doSomething()
类型的实例是否不能调用
RobustClass

目前,您可以通过强制构建中断来检查这一点,然后对其进行注释。这很烦人,因为每次检查都需要手动编辑代码

我们可以使用SFINAE检测
.doSomething()
是否可以对类型
T
执行有效操作,然后按照以下步骤反转测试:

namespace details {
  template<template<class...>class Z, class, class...Ts>
  struct can_apply:std::false_type{};
  template<template<class...>class Z, class...Ts>
  struct can_apply<Z, std::void_t<Z<Ts...>>, Ts...>:std::true_type{};
}
template<template<class...>class Z, class...Ts>
using can_apply = details::can_apply<Z, void, Ts...>;

template<class X>
using do_something_r = decltype( std::declval<X>().doSomething() );
template<class X>
using can_do_something = can_apply<do_something_r, X>;

can\u apply
与C++20相似,但不完全相同,建议的
is\u detected

我相信您希望能够检查
RobustClass::doSomething()
类型的实例是否不能调用
RobustClass

目前,您可以通过强制构建中断来检查这一点,然后对其进行注释。这很烦人,因为每次检查都需要手动编辑代码

我们可以使用SFINAE检测
.doSomething()
是否可以对类型
T
执行有效操作,然后按照以下步骤反转测试:

namespace details {
  template<template<class...>class Z, class, class...Ts>
  struct can_apply:std::false_type{};
  template<template<class...>class Z, class...Ts>
  struct can_apply<Z, std::void_t<Z<Ts...>>, Ts...>:std::true_type{};
}
template<template<class...>class Z, class...Ts>
using can_apply = details::can_apply<Z, void, Ts...>;

template<class X>
using do_something_r = decltype( std::declval<X>().doSomething() );
template<class X>
using can_do_something = can_apply<do_something_r, X>;

can\u apply
与C++20相似,但不完全相同,建议的
是检测到的

I!=2
表示
RobustClass
没有
doSomething()
。因此,根据SFINAE,可以创建
robustClass2
,只是没有声明
doSomething()
。正如你提到的;一切按计划进行。为什么希望选项仍然保留
robustClass2.doSomething()”?你还想得到什么额外的好处或价值?@Yakk为什么该计划形式不正确?@Mus campester robustClass2.doSomething();不应该在编译代码的任何输出和运行安装中,这是实际的一点。但是我需要测试,如果代码中有这样一个糟糕的结构,那么编译代码是不可能的。RobustClass可以用100ds的值进行实例化,但是doSomething只能从一个实例化中调用,该实例化的值与2不同。我知道问题是如何包装
robustClass2.doSomething()
,这样就不会破坏编译。也许你只是希望得到一个警告?但现在从评论来看,我更困惑了。看来真正的问题是,;这是否可以消除出现的
robustClass2.doSomething()?@Muscampester啊,我误读了部分技术。我认为OP这样做是合法的。
I!=2
表示
RobustClass
没有
doSomething()
。因此,根据SFINAE,可以创建
robustClass2
,只是没有声明
doSomething()
。正如你提到的;一切按计划进行。为什么希望选项仍然保留
robustClass2.doSomething()”?你还想得到什么额外的好处或价值?@Yakk为什么该计划形式不正确?@Mus campester robustClass2.doSomething();不应该在编译代码的任何输出和运行安装中,这是实际的一点。但是我需要测试,如果代码中有这样一个糟糕的结构,那么编译代码是不可能的。RobustClass可以用100ds的值进行实例化,但是doSomething只能从一个实例化中调用,该实例化的值与2不同。我知道问题是如何包装
robustClass2.doSomething()
,这样就不会破坏编译。也许你只是希望得到一个警告?但现在从评论来看,我更困惑了。看来真正的问题是,;这是否可以消除出现的
robustClass2.doSomething()?@Muscampester啊,我误读了部分技术。我认为OP这样做是合法的。