gpt4 book ai didi

c++ - 我可以单独定义类模板的函数模板成员吗?

转载 作者:行者123 更新时间:2023-12-05 01:50:38 25 4
gpt4 key购买 nike

这是一个最小的代码示例,用于展示我正在尝试的工作方式,但不是我希望的方式:

#include <string>
#include <type_traits>
#include <iostream>
struct string_tag {
using R=const std::string;
};

struct int_tag {
using R=const int;
};

template <bool TS>
class Wibble {
public:
template<typename TAG>
typename TAG::R getValue(TAG);
};

template <bool TS>
template <typename TAG>
typename TAG::R Wibble<TS>::getValue(TAG) {
if constexpr (std::is_same<TAG, string_tag>::value) {
return "hello";
}

if constexpr (std::is_same<TAG, int_tag>::value) {
return 42;
}
}

// instantiate classes
template class Wibble<true>;
template class Wibble<false>;

int main () {
Wibble<true> tw;
Wibble<false> fw;
std::cout << "tw string: " << tw.getValue(string_tag{}) << std::endl;
std::cout << "tw int: " << tw.getValue(int_tag{}) << std::endl;
std::cout << "fw string: " <<fw.getValue(string_tag{}) << std::endl;
std::cout << "fw int: " << fw.getValue(int_tag{}) << std::endl;
}

example in godbolt here

我想更改的部分是包含所有 constexpr 逻辑的丑陋函数模板定义。我希望能够在 TAG 中独立定义不同的特化,但这样做会给我 redefinition of ... 错误。

像下面这样的语法会很好:

template<bool TS>
template<>
string_tag::R Wibble<TS>::getValue(string_tag) {
return "hello";
}

但是计算机说“不”。

最佳答案

我考虑了一下,阅读了语言规范等,然后想到了以下内容:

  1. 为了特化成员函数模板,必须特化类模板。时期。这不能用概念来克服,或者至少我还没有找到方法。我猜你不想为每个 TS 案例复制代码。也许它可以通过一些 Alexandrescu 风格的元编程技术自动完成,但我无法立即想到任何东西。

  2. 重载而不是模板是一个很好的选择,但我猜您希望能够在行外而不是在类中添加它们...

  3. 然后我想起了 David Wheeler 的话:“计算机科学中的所有问题都可以通过另一个间接级别来解决。”所以让我们添加一个:

namespace detail
{
template<typename TAG> auto getValue(TAG);

template<>
auto getValue<string_tag>(string_tag)
{
return "hi";
}


template<>
auto getValue<int_tag>(int_tag)
{
return 42;
}

template<>
auto getValue<double_tag>(double_tag)
{
return 1324.2;
}

}

template<bool TS>
template<typename TAG>
auto Wibble<TS>::getValue(TAG t)
{
return detail::getValue(t);
}

https://godbolt.org/z/GsPK4MP8M希望对您有所帮助。

关于c++ - 我可以单独定义类模板的函数模板成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72904741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com