自动扣除模板

Auto deduction for templates

本文关键字:      更新时间:2023-10-16

昨天我在stackoverflow上有一个关于实现不同模板类型之间特定转换的问题。

这是几乎被提议的类。我说几乎是因为我改变了它的一小部分,希望能简化它。

#include <iostream>
#include <type_traits>
// Helper class
template<bool from, bool to> 
struct ok_to_copy_foos : std::false_type {};
// Define all valid conversions as specializations:
template<>
struct ok_to_copy_foos<false, false> : std::true_type {};
template<>
struct ok_to_copy_foos<true, false> : std::true_type {};
////////////////////////////////////////////////////////////////////
template<bool Owner>
class Foo {
static constexpr bool owner_ = Owner;
public:
    Foo() {}
    Foo(const Foo &o)
    {
        static_assert(ok_to_copy_foos<Owner, Owner>::value, "can only copy from Foo<true> to Foo<false>");
    }
    Foo& operator=(const Foo& foo) 
    {
        static_assert(ok_to_copy_foos<Owner, Owner>::value, "can only assign from Foo<true> to Foo<false>");
        return *this;
    }
    template<bool U>
    Foo(const Foo<U> &)
    {
        static_assert(ok_to_copy_foos<Owner, Owner>::value, "can only copy from Foo<true> to Foo<false>");
    }
    template<bool U>
    Foo &operator=(const Foo<U> &)
    {
        static_assert(ok_to_copy_foos<Owner, Owner>::value, "can only assign from Foo<true> to Foo<false>");
        return *this;
    }
    void bar()
    {
        std::cout << owner_ << " n";
    }
};

在这个类中,目的是您可以复制或赋值,但结果应该始终是Foo<false>,而其他一切都是禁止的。本质上,这意味着你不能从Foo<true>复制或分配到Foo '。我不确定是否有更好的方法来实现这一点,但这是我目前得到的。

然而,有些东西不能像我希望的那样工作,我需要一些帮助来实现这一点。

Foo<true> t;
auto f = t;

这将导致编译器错误问题是编译器能否判断出auto实际上应该是Foo<false> ?

简短的回答是:不。c++根本不是这样工作的。

auto表示:被声明的对象与初始化它的表达式的类型相同。如果这导致编译错误,编译器不会尝试它所知道的每个类,作为替代,看看是否有可用的转换可以用来从表达式初始化它。

正如@SamVarshavchik所写,auto不会为你做这些。但我想知道你可能想如何以不同的方式处理这个问题:

我觉得你在这里过度使用模板了。本质上,Owner模板参数是特定于实例的数据。除非考虑其他基本因素,否则它应该是Foo类的数据成员。在这种情况下,您可以轻松地让赋值操作符强制受让人的所有者为false。现在,这确实不会阻止您调用不应该工作的方法-因此您将抛出运行时异常而不是编译时断言-但如果这是至关重要的,您可以通过子类化实现相同的效果。

同样,简单地为您的Foo提供某种代理或外观类,或者可能只是一个迭代器,它甚至没有用于复制的接口,这可能是值得的。

使用上述一个或两个建议,您甚至不需要/不想要trait类,因为类的定义和名称会使编译器和阅读代码的程序员立即明白什么可以复制到什么。

相关文章:
  • 没有找到相关文章