相关疑难解决方法(0)

为什么std :: result_of将(不相关的)函数类型作为类型参数?

我意识到"为什么事情就像他们一样"问题通常不是最好的,但是很多人都在调整标准委员会讨论,所以我希望这可以在事实上得到回答,因为我对于什么是合法的好奇答案是.

基本上,我std::result_of第一次看到它时花了很长时间才弄清楚模板签名是怎么回事:我认为这是一个我从未见过的模板参数的全新构造.

template< class F, class... ArgTypes >
class result_of<F(ArgTypes...)>;
Run Code Online (Sandbox Code Playgroud)

经过一段时间的思考,我意识到这实际上是什么:F(ArgTypes...)是一个函数类型,但它不是正在评估结果类型的函数的类型(只是F):它是一个带ArgTypes...参数和返回类型的函数的类型F.

这不是......奇怪吗?有点hackish?有没有人知道委员会是否讨论过任何替代方案,例如,以下......

template< class F, class... ArgTypes >
class result_of<F, ArgTypes...>;
Run Code Online (Sandbox Code Playgroud)

我想有可能的情况是第二个结构不能像第一个结构那样容易使用,但是哪个?

我不是试图对此作出判断,但只是在我第一次看到它时,这对我来说是合法的混淆,所以我很好奇是否有充分的理由.我意识到答案的一部分可能只是"因为Boost这样做了",但仍留下剩下的(事实)问题......

  • 是否存在技术原因Boost选择此语法来编码类型信息而不是任何替代方案?

  • C++ 11委员会是否有任何关于如何将其标准化的讨论,因为无论如何std::result_of都可以decltype相当容易地实现?

c++ boost std c++11

18
推荐指数
2
解决办法
1837
查看次数

确定std :: bind()结果的arity和其他特征的标准方法?

几天来我一直在试着弄清楚如何让一个类有一个很好的干净的公共接口来执行回调机制的注册.回调可以是C++ 11个lambda表达式,std::function<void(Type1,Type2)>,std::function<void(Type2)>,std::function<void()>,或的结果std::bind().

这个接口的关键是该类的用户只需要知道一个公共接口,它接受用户可能抛出的几乎任何functor/callback机制.

简化的类显示了仿函数和接口的注册

struct Type1;
struct Type2; // May be the same type as Type1
class MyRegistrationClass
{
public:
    /**
     * Clean and easy to understand public interface:
     * Handle registration of any functor matching _any_ of the following
     *    std::function<void(Type1,Type2)>
     *    std::function<void(Type2)>        <-- move argument 2 into arg 1
     *    std::function<void()>
     *    or any result of std::bind() requiring two or fewer arguments that
     *    can convert to the above std::function< …
Run Code Online (Sandbox Code Playgroud)

ambiguous arity stdbind variadic-templates c++11

7
推荐指数
1
解决办法
916
查看次数

标签 统计

c++11 ×2

ambiguous ×1

arity ×1

boost ×1

c++ ×1

std ×1

stdbind ×1

variadic-templates ×1