C++11 Boost可以断言方法调用实例化不会编译吗?
下面的代码运行良好,我很满意我的健壮类 然而,断言某些方法调用实例化在编译时不通过手动注释in和out进行编译,至少是非常乏味的。我明白,只有通过实际编译才能预见到编译会失败。这是一个棘手的情况。但是,有没有一些漂亮的方法可以避免太多的代码混淆呢 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
#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这样做是合法的。